【问题标题】:Followed the official android documentations but still could not use SQLite in app遵循了官方的 android 文档,但仍然无法在应用程序中使用 SQLite
【发布时间】:2010-06-14 17:09:18
【问题描述】:

我的 DBHelper 类

public class DBHelper extends SQLiteOpenHelper {

 public DBHelper(Context context)
 {
  super(context,"SIMPLE_DB",null,1);
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL("CREATE TABLE SIMPLE_TABLE ( " + 
    "ID INTEGER PRIMARY KEY " +
    "DESC TEXT);");
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

 }
}

活动类

    public class SimpleDatabase extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            DBHelper dbHelper = new DBHelper(this);
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            db.execSQL("INSERT INTO SIMPLE_TABLE VALUES (NULL, 'test');");
            Cursor cursor = db.rawQuery("SELECT * FROM SIMPLE_TABLE", null);
            TextView text = (TextView)findViewById(R.id.textbox);
            text.setText(cursor.getString(0));
        }

}

我认为它在 SQLiteDatabase db = ... 处崩溃了(应用程序已意外停止!),因为如果我将代码从那里注释到最后,那么它工作正常。但我不知道为什么会这样。 任何帮助将不胜感激。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    没关系,我现在知道我做错了什么。

    db.execSQL("CREATE TABLE SIMPLE_TABLE ( " + "ID INTEGER PRIMARY KEY<comma goes here> " + "DESC TEXT);");
    

    逗号是严肃的事情。抱歉这个愚蠢的问题。

    【讨论】:

      【解决方案2】:

      首先你应该确保你的 SQL 语句是正确的。如果 sqlite3 在您的路径中,您可以执行命令:

      $>: sqlite3 testdb.db

      之后,您将进入一个 shell,您可以在其中测试您的 SQL 语句是否语法正确。 (提示:参考上面的例子:这是不正确的)。

      之后,您应该按照 Aurora 的说明正确处理光标。

      也许你应该实现你的 onUpgrade() 方法,例如:

      @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          db.execSQL("DROP TABLE IF EXISTS SIMPLE_TABLE");
          onCreate(db);
      }
      

      【讨论】:

        【解决方案3】:

        首先,为了帮助您进行调试,请确保使用调试监视器和日志。从长远来看,这将使您的生活更轻松!如果您使用的是 Eclipse,请选择 Window -> Open Perspective -> Other -> DDMS。 LogCat 将显示程序运行时发生的情况。文档描述了它here。再次运行您的程序并观察 LogCat。它应该为您提供更多信息并告诉您哪行代码正在崩溃。

        就您的代码而言,我注意到的第一件事是,在您返回光标后,您需要调用 cursor.moveToFirst();选择(第一)行。然后当你调用 cursor.getString(0); 时,它表示第零行的第零列。如果你不调用 moveToFirst();那么你 cursor.getString(0) 将获得第 -1 行的第零列,并成为索引越界错误。默认情况下,光标将从第 -1 行开始。

        根据您希望在光标中移动的方式以及返回的结果/行数,您可能还需要调用 cursor.movetoPosition() 或 cursor.moveToNext()。查看游标here的文档。

        【讨论】:

        • 感谢您的回复。使用了调试工具,这些是我得到的 2 个相关错误:>>Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: and >>at ...SimpleDatabase.onCreate (SimpleDatabase.java:16)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        相关资源
        最近更新 更多