遵循官方的Android文档,但仍然无法在应用程序中使用SQLite

时间:2010-06-14 17:09:18

标签: android sqlite

我的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 = ...因为如果我从那里评论代码到最后那么它工作正常。但我不知道为什么会这样做。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

没关系,弄清楚我现在做错了什么。

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

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

答案 1 :(得分:1)

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

$&gt;: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);
}

答案 2 :(得分:0)

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

就你的代码而言,我注意到的第一件事是你得到一个游标后,你需要调用cursor.moveToFirst();选择(第一)行。然后,当您调用cursor.getString(0);时,它指示零行的零点列。如果你不调用moveToFirst();那么你的cursor.getString(0)将获得第-1行的zeroeth列,并且是一个超出范围的索引错误。默认情况下,光标将从第-1行开始。

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