我的sqlite数据库不能正常工作,所以为了确保我有正确的数据库,我尝试检查列,使用这个:
Cursor c = helper.getReadableDatabase().rawQuery("SELECT name FROM sqlite_temp_master WHERE type=?", new String[] {"table"});
for (int i = 0; i <= c.getColumnCount(); i++){
System.out.println(c.getString(i));}
现在,我希望这会给我数据库中所有列的名称。 但是,我遇到了一个cursoroutofboundsexception。
我是否认为这只能说我的数据库没有任何列,因此是空的?
我可以在sqlite数据库浏览器中打开数据库,因此我的导入一定有问题 - 或者我的代码是否有错误?
我的数据库是否有可能不存在,这就是为什么它不起作用?
我按照下面的答案抛弃了我的诅咒。
结果:
09-22 03:29:31.450: I/System.out(845): >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@b2dfd7a0
现在这不是很有用。
这是否意味着没有数据库,出于什么原因,或者是否在其他地方打印?
好吧,至少有效,但结果如下:
09-22 15:10:35.754: I/System.out(1095): name=android_metadata
我想知道为什么没有其他列,虽然它们显然在数据库中,我可以用数据库浏览器打开文件。 这是一个典型的错误吗?
答案 0 :(得分:1)
迭代光标行的典型习惯是
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { ... }
列索引从零开始,因此要遍历行的列,您可以执行
int columnCount = cursor.getColumnCount();
for (int i = 0; i < columnCount; i++) { ... }
但如果你想要做的就是打印出它的内容,我只需将光标移到DatabseUtils.dumpCursor(Cursor cursor)
。
修改强>
您应该从sqlite_master
而不是sqlite_temp_master
中进行选择,因为后者只存储有关临时表和视图的信息。