简体   繁体   English

运行getAllComments()方法时,android SQLITE数据库应用程序oncreate崩溃

[英]android SQLITE database app crashes oncreate when it runs the getAllComments() method

i am trying to make an app which you can enter two comments into the database at once, it keeps crashing oncreate when it tries to add all the comments to the list. 我正在尝试制作一个您可以一次在数据库中输入两个注释的应用程序,当尝试将所有注释添加到列表中时,oncreate总是崩溃。 any help would be most appreciated. 非常感激任何的帮助。 thank you in advance. 先感谢您。

onCreate onCreate

 @Override

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.comments);
    etComm = (EditText) findViewById(R.id.etComment);
    etname = (EditText) findViewById(R.id.etName);
    //Create a new data manager objects
    datasource = new CommentsManageData(this);
    datasource.open(); //Create or open the database
    List<Comment> values = datasource.getAllComments();
    // use the SimpleCursorAdapter to show elements in a ListView
    ArrayAdapter<Comment> adapter = new ArrayAdapter<Comment>(this,
        android.R.layout.simple_list_item_1,values);
    setListAdapter(adapter);
  }

 //This retrieves data from the database and puts it into an ArrayList
  public List<Comment> getAllComments() {
        List<Comment> comments = new ArrayList<Comment>();
        //Retrieve all comments - returns a cursor positioned 
        //over first item in the results     
        Cursor cursor = database.query(CommentsSQLiteHelper.TABLE_COMMENTS,
          allColumns, null, null, null, null, null);
        cursor.moveToFirst(); //Just in case it wasn't there already
        while (!cursor.isAfterLast()) {
            Comment comment = cursorToComment(cursor);
            comments.add(comment);//Add the comment

            cursor.moveToNext(); // move to the next item in results
        }
        cursor.close(); // make sure to close the cursor
        return comments;
      }

SQLiteOpenHelper: SQLiteOpenHelper:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/*
 * This class is responsible for creating the database. 
 * It also defines several constants for the table name and the table columns
 * This could be a private class within CommentsDataSource
 */
public class CommentsSQLiteHelper extends SQLiteOpenHelper {//Note subclass

      public static final String TABLE_COMMENTS = "comments";
      public static final String COLUMN_ID = "_id";
      public static final String COLUMN_COMMENT = "comment";
      public static final String COLUMN_NAME = "name";
      private static final String DATABASE_NAME = "commments.db";
      private static final int DATABASE_VERSION = 1;

      // Database creation sql statement
      private static final String DATABASE_CREATE = "create table "
          + TABLE_COMMENTS + "(" + 
          COLUMN_ID + " integer primary key autoincrement, " +
          COLUMN_COMMENT + " integer not null, "+
          COLUMN_NAME + "integer not null)";

      public CommentsSQLiteHelper (Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
      }
      //Must override this method
      public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE);
      }

      //The onUpgrade() method will simply delete all existing data and re-create the table.
    //Must override this method
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(CommentsSQLiteHelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_COMMENTS);
        onCreate(db);
      }

    } 


   comment object code 

public class Comment {
      private long id;
      private String comment;
      private String name;


      public long getId() {
        return id;
      }

      public void setId(long id) {
        this.id = id;
      }

      public String getComment() {
        return comment;
      }

      public void setComment(String comment) {
        this.comment = comment;
      }

      public String getname() {
            return name;
          }

     public void setname(String name) {
            this.name = name;
          }
}

Logcat: Logcat:

04-28 04:10:35.998: E/SQLiteLog(1332): (1) no such column: name
04-28 04:10:36.068: E/AndroidRuntime(1332): FATAL EXCEPTION: main
04-28 04:10:36.068: E/AndroidRuntime(1332): Process: cct.mad.lab, PID: 1332
04-28 04:10:36.068: E/AndroidRuntime(1332): java.lang.RuntimeException: Unable to start activity ComponentInfo{cct.mad.lab/cct.mad.lab.CommentsApp}: android.database.sqlite.SQLiteException: no such column: name (code 1): , while compiling: SELECT _id, comment, name FROM comments
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.os.Looper.loop(Looper.java:136)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at java.lang.reflect.Method.invokeNative(Native Method)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at java.lang.reflect.Method.invoke(Method.java:515)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at dalvik.system.NativeStart.main(Native Method)
04-28 04:10:36.068: E/AndroidRuntime(1332): Caused by: android.database.sqlite.SQLiteException: no such column: name (code 1): , while compiling: SELECT _id, comment, name FROM comments
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at cct.mad.lab.CommentsManageData.getAllComments(CommentsManageData.java:33)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at cct.mad.lab.CommentsApp.onCreate(CommentsApp.java:22)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.Activity.performCreate(Activity.java:5231)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-28 04:10:36.068: E/AndroidRuntime(1332):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)

The logcat you posted, says no such column "name" which means that your database table "TABLE_COMMENTS" which has column with title "name" is not created successfully. 您发布的日志记录没有说出这样的列“名称”,这意味着没有成功创建具有标题为“名称”的列的数据库表“ TABLE_COMMENTS”。 And from your CommentsSQLiteHelper class, you are creating your table like this: 然后从CommentsSQLiteHelper类中创建表,如下所示:

// Database creation sql statement
  private static final String DATABASE_CREATE = "create table "
      + TABLE_COMMENTS + "(" + 
      COLUMN_ID + " integer primary key autoincrement, " +
      COLUMN_COMMENT + " integer not null, "+
      COLUMN_NAME + "integer not null)";

Here, if you'll observe there is no space between COLUMN_NAME & start of "integer not null" so it is clearly taking it as single string column name with no data type. 在这里,如果您发现COLUMN_NAME与“ integer not null”之间没有空格,那么显然它将其视为没有数据类型的单字符串列名称。

See here -> COLUMN_NAME + "integer not null)"; 看到这里-> COLUMN_NAME +“整数不为null)”; (No space before start of datatype integer) (在数据类型整数的开头之前没有空格)

Hence, workaround is to put space before start of " integer not null". 因此,解决方法是在“ integer not null”的开头之前放置空格。 Copy paste below code: 复制粘贴以下代码:

 // Database creation sql statement
  private static final String DATABASE_CREATE = "create table "
      + TABLE_COMMENTS + "(" + 
      COLUMN_ID + " integer primary key autoincrement, " +
      COLUMN_COMMENT + " integer not null, "+
      COLUMN_NAME + " integer not null)";

UPDATE: As you are using string(text) in your "comment" & "name" field change datatype of COLUMN_COMMENT & COLUMN_NAME from integer to text(string). 更新:在“注释”和“名称”字段中使用字符串(文本)时,将COLUMN_COMMENT和COLUMN_NAME的数据类型从整数更改为文本(字符串)。

Use below code: 使用以下代码:

private static final String DATABASE_CREATE = "create table "
      + TABLE_COMMENTS + "(" + 
      COLUMN_ID + " integer primary key autoincrement, " +
      COLUMN_COMMENT + " text not null, "+
      COLUMN_NAME + " text not null)";

Your error is: "no such column: name (code 1): , while compiling: SELECT _id, comment, name FROM comments". 您的错误是:“没有这样的列:名称(代码1):,而编译时:SELECT _id,注释,名称FROM注释”。

The column name does not exists in your DB. 列名在您的数据库中不存在。

Furthermore, you coded this: 此外,您对此进行了编码:

  // Database creation sql statement
  private static final String DATABASE_CREATE = "create table "
      + TABLE_COMMENTS + "(" + 
      COLUMN_ID + " integer primary key autoincrement, " +
      COLUMN_COMMENT + " integer not null, "+
      COLUMN_NAME + "integer not null)";

As you want to store comments, why to use integer ? 当您要存储注释时,为什么要使用整数? it should be text like this: 它应该是这样的文本:

  // Database creation sql statement
  private static final String DATABASE_CREATE = "create table "
      + TABLE_COMMENTS + " (" + 
      COLUMN_ID + " integer primary key autoincrement, " +
      COLUMN_COMMENT + " text, "+
      COLUMN_NAME + " text)";

每当您对数据库结构进行更改时,请确保增加数据库版本以调用onUpgrade ,在该位置应删除旧数据库结构并回调onCreate以使用更改来重建数据库。

This seems simple enough. 这似乎很简单。

You have an error stating that the column doesn't exist in your database. 您有一个错误,指出该列在数据库中不存在。

This is commonly caused by you changing the database, after it was already created in your android environment. 这通常是由于您已经在android环境中创建数据库之后更改数据库而引起的。

You can remove this by uninstalling the app. 您可以通过卸载应用程序将其删除。 and reinstalling it, which would effectively create a new database and should move you on to a working version. 并重新安装它,这将有效地创建一个新数据库,并应将您转移到工作版本。

Let me know if this didn't help. 让我知道这是否没有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从SQLite数据库检索数据时Android应用程序崩溃 - Android app crashes when retrieving data from SQLite database 尝试连接到SQLite数据库时Android应用程序崩溃 - Android app crashes when trying to connect to SQLite database 在 OnCreate 中添加新代码时,Android 应用程序挂起/崩溃 - Android app suspends/crashes when add new code inside OnCreate 我正在为Android进行登录和注册,但是我使用的sqlite数据库在onCreate上崩溃了 - I am making a login and sign up page for android but the sqlite database i use crashes on onCreate 单击Android登录按钮会使应用程序崩溃。 按钮验证使用Sqlite数据库的登录 - Android login button crashes app when clicked. Button validates login with Sqlite database 在Android的onCreate()中从SQLite数据库填充ListView - Populate ListView From SQLite database in onCreate() in Android 在 Android SQLite 数据库 onCreate() 中重新抛出异常 - Rethrow Exception in Android SQLite Database onCreate() 将数据保存到数据库时,Android应用程序崩溃 - Android app crashes when saving data to database 从 SQLite 数据库访问数据后应用程序崩溃 android - App crashes after accessing data from SQLite Database android 将文本添加到SQLite数据库时,Android程序崩溃 - Android program crashes when adding text to SQLite database
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM