【问题标题】:Can't get any data back from SQLite无法从 SQLite 取回任何数据
【发布时间】:2013-12-29 06:04:11
【问题描述】:

我编写了这个简单的 Activity 来测试 Android 上的 SQLite 数据库的写入和读取。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
        DatabaseHelper db = new DatabaseHelper(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private class DatabaseHelper extends SQLiteOpenHelper
    {

        public DatabaseHelper(Context context) {
            super(context, "TestDatabase", null, 3);
            getWritableDatabase().rawQuery("INSERT INTO TestTable VALUES ('Apple')", null);
            Cursor cursor = getReadableDatabase().rawQuery("SELECT * FROM TestTable", null);
            Log.d("trace", String.valueOf(cursor.moveToFirst()));
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE TestTable (value text)");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS TestTable");
            onCreate(db);
        }

    }

}

它的核心是在 DatabaseHelper 构造函数中,我在其中向 TestTable 写入一个值,尝试在游标中取回它,然后记录 cursor.moveToFirst() 的值(如果只有 false光标为空)。这是false。怎么回事?

【问题讨论】:

  • 不要在构造函数中做这样的事情。声明一种写入数据的方法和另一种读取数据的方法。
  • @ramaral 这只是一个测试程序。还是有其他原因?
  • 我可以通过使用 .insert 而不是 .rawQuery 来编写它,但我不知道为什么 .rawQuery 不起作用。
  • “但我不知道为什么 .rawQuery 不起作用。” 因为它是一种执行查询而不是执行其他 SQL 操作(例如插入、删除等)的方法等) - 名称有点泄露它。
  • 可以使用execSQL()执行非查询语句。

标签: android sqlite android-sqlite


【解决方案1】:

文档说

rawQuery 运行提供的 SQL 并返回结果集上的游标。

从那时起,您不应该将它用于INSERT。尝试execSQLinsert 获取插入行的行ID。

【讨论】:

  • 文档可能更模糊吗?请原谅我假设“raw”的意思是 raw。谢谢。
  • 你几乎是对的,但将查询(rawQuery)视为查询。 :)
  • 嗯,我一直认为“查询”是任何 SQL 命令的总称。
  • @JackM 有关查询/执行区分和 Android sqlite 文档怪癖的答案,请参阅stackoverflow.com/questions/20110274/…
【解决方案2】:

1) rawQuery() 应改为 execSQL,如下行:

    public DatabaseHelper(Context context) {
        super(context, "TestDatabase", null, 3);

        getWritableDatabase().execSQL("INSERT INTO TestTable VALUES ('Apple')");
        Cursor cursor = getReadableDatabase().rawQuery("SELECT * FROM TestTable", null);
        Log.d("trace:", String.valueOf(cursor.moveToFirst()));
    }

2) 为了确保调用 onCreate(),请在 DatabaseHelper 类中覆盖 onDowngrade():

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS TestTable");
        onCreate(db);
    } 

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2018-05-28
    • 2012-01-06
    • 1970-01-01
    • 2021-02-16
    • 2013-06-05
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多