我正在尝试在Android中设置一个简单的SQLite数据库,通过SQLiteOpenHelper的子类处理模式。但是,当我查询我的表时,我认为我插入的列永远不存在。
即,在SQLiteOpenHelper的onCreate(SQLiteDatabase db)
方法中,我使用db.execSQL()
运行CREATE TABLE命令,然后尝试db.execSQL
和db.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();
}
}
答案 0 :(得分:2)
想出来,这是一些不同的事情。首先,主要是查询代码:Cursor
只能导航什么是开放数据库。所以上面的查询方法将返回一个Cursor,然后关闭finally块中的数据库。
虽然它无法正常运行,但如果在已关闭的数据库下运行,Cursor不会抛出错误。它只会说它返回0行(这就是为什么我认为错误是在INSERT代码中)。
另外,我忘记了一些SQL事情,即row
和col
不是表字段的好名字,我能够通过将它们重命名为{{{{}}来消除一些错误。 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);