想要在Android上插入SQLite吗?

时间:2010-04-05 05:30:35

标签: android sqlite

我正在尝试在Android中设置一个简单的SQLite数据库,通过SQLiteOpenHelper的子类处理模式。但是,当我查询我的表时,我认为我插入的列永远不存在。

即,在SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法中,我使用db.execSQL()运行CREATE TABLE命令,然后尝试db.execSQLdb.insert()在表I上运行INSERT命令刚创造了。这似乎运行正常,但是当我尝试查询它们时,我总是返回0行(对于调试,我正在运行的查询很简单SELECT * FROM table并检查Cursor的getCount())。

之前有人碰到这样的事吗?这些命令似乎在命令行sqlite3上运行。它们是否是我所缺少的(例如INSERTS必须/不能以分号终止,或者涉及多个表的某些问题)?我已经附上了下面的一些代码。

感谢您的时间,如果我能进一步澄清,请告诉我。


@Override
public void onCreate(SQLiteDatabase db)
{
    db.execSQL("CREATE TABLE "+ LEVEL_TABLE +" (" + 
               "  "+ _ID +" INTEGER PRIMARY KEY AUTOINCREMENT," +
               "  level TEXT NOT NULL,"+
               "  rows INTEGER NOT NULL,"+
               "  cols INTEGER NOT NULL);");

    db.execSQL("CREATE TABLE "+ DYNAMICS_TABLE +" (" + 
               "  level_id INTEGER NOT NULL," +
               "  row INTEGER NOT NULL,"+
               "  col INTEGER NOT NULL,"+
               "  type INTEGER NOT NULL);");

    db.execSQL("CREATE TABLE "+ SCORE_TABLE +" (" + 
               "  level_id INTEGER NOT NULL," +
               "  score INTEGER NOT NULL,"+
               "  date_achieved DATE NOT NULL,"+
               "  name TEXT NOT NULL);");
    this.enterFirstLevel(db);
}

我正在使用的插入代码示例,它在enterFirstLevel()中被调用(某些值被硬编码以使其运行...):

private void insertDynamic(SQLiteDatabase db, int row, int col, int type)
{
    ContentValues values = new ContentValues();

    values.put("level_id", "1");
    values.put("row", Integer.toString(row));
    values.put("col", Integer.toString(col));
    values.put("type", Integer.toString(type));

    db.insertOrThrow(DYNAMICS_TABLE, "col", values);
}

最后,查询代码如下所示:

private Cursor fetchLevelDynamics(int id)
{
    SQLiteDatabase db = this.leveldata.getReadableDatabase();
    try {
        String fetchQuery = "SELECT * FROM " + DYNAMICS_TABLE;
        String[] queryArgs = new String[0];         
        Cursor cursor = db.rawQuery(fetchQuery, queryArgs);

        Activity activity = (Activity) this.context;
        activity.startManagingCursor(cursor);
        return cursor;
    }
    finally {
        db.close();
    }
}

3 个答案:

答案 0 :(得分:2)

想出来,这是一些不同的事情。首先,主要是查询代码:Cursor只能导航什么是开放数据库。所以上面的查询方法将返回一个Cursor,然后关闭finally块中的数据库。

虽然它无法正常运行,但如果在已关闭的数据库下运行,Cursor不会抛出错误。它只会说它返回0行(这就是为什么我认为错误是在INSERT代码中)。

另外,我忘记了一些SQL事情,即rowcol不是表字段的好名字,我能够通过将它们重命名为{{{{}}来消除一些错误。 1}}和row_num

答案 1 :(得分:0)

对我来说看起来还不错。

要进行问题排查,我建议您在queryArgs中添加至少一列。我不确定发送空列表的效果。即使有结果,也可能导致没有返回行。

没有必要将Integer值转换为ContentValues中的字符串。尝试用values.put("row", Integer.toString(row));替换values.put("row", row);可能不是问题的原因,但如果它反对字符串会抛出异常。

我从未使用过SQLiteDatabase.rawQuery(),也许尝试更常用的.query()?

我无法看到你的代码用fetchLevelDynamics()返回的'cursor'做了什么,所以我不能排除那里的逻辑错误。

答案 2 :(得分:0)

尝试使用null作为

中的第二个参数
db.insertOrThrow(DYNAMICS_TABLE, "col", values);