【问题标题】:Android Sqlite3 - column created by command line but not from my Android codeAndroid Sqlite3 - 由命令行创建的列,但不是来自我的 Android 代码
【发布时间】:2013-03-28 15:35:12
【问题描述】:

我正在开发一个具有内部 Sqlite 数据库的项目。我添加了一个新表(Table1) 通过外壳和通过 android 在其中插入和删除一些新值的 1 列(column1)。我尝试通过命令行添加两个新列 column2column3 并通过 shell 调用它:

**PRAGMA table_info(Table1);**

我看到两个新列的创建是正确的,因为我得到了这个输出:

*0|column1|varchar(20)|1||1
1|column2|varchar(255)|1||0
2|column3|varchar(255)|1||0*

很好。 对

的调用
**cursor.getColumnIndex("column1"));** 

继续正常,但是 在这里传递另一个参数:

**cursor.getColumnIndex("column2"));**

正在返回-1,例如此列尚未创建。所以相同的数据库,但shell和android之间的区别。有什么提示可以帮助您了解问题所在?

【问题讨论】:

  • 如何创建光标?
  • Cursor cursor = db.query("Table1", columns, condition, null, null, null, null); while (cursor.moveToNext()) { ...

标签: java android sqlite


【解决方案1】:

有什么提示可以帮助您了解问题所在?

问题可能与db和cursor有关。

但我的建议是,如果您想升级 db(不同版本号),这意味着执行一些更改(添加/删除/修改列、关系等),您应该使用 onUpgrade() 方法直接指定用于类似您的目的,或者也可以使用经典的ALTER TABLE 子句。

我不建议你通过 shell 使用PRAGMA

注意:

对于“保证”,请尝试在您的应用程序中执行简单查询:

String query = "pragma table_info(Table1)";
c = db.rawQuery(query, null);
if (c.moveToFirst()) {
   do {
      String name = c.getString(c.getColumnIndex("name"));
      String type = c.getString(c.getColumnIndex("type"));
      Log.i("Information", name + " " + type);
   } while (c.moveToNext());
}

通过这个你可以找到你的问题所在。如果它只显示一列,则问题是 db.如果不是,问题是光标。

【讨论】:

    【解决方案2】:

    现在可以了。我忘记编辑传递给返回Cursor的方法的参数columns

     db.query();
    

    其他答案有助于解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多