Android sqlite 无法创建 TEMP table

Android sqlite can't create TEMP table

我想在 android sqlite 数据库中创建和使用临时 table。
SQL 语句执行无任何异常,但没有创建 table!
运行 我的应用程序带有下面的示例代码,我没有得到 tables:

开始编辑

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "mydb.db";
private static DatabaseHelper instance;

public static synchronized DatabaseHelper getHelper(Context context){
    if (instance == null)
        instance = new DatabaseHelper(context);
    return instance;
}

private DatabaseHelper(Context c) {
    super(c,DB_NAME,null,1);
}

@Override
public void onConfigure(SQLiteDatabase db) {
    super.onConfigure(db);
    db.enableWriteAheadLogging ();
    db.setLocale(Locale.getDefault());
}

@Override
public void onCreate(SQLiteDatabase db) {
    // lots of table creation
    db.execSQL("CREATE TABLE my_table (id INTEGER PRIMARY KEY, value TEXT)");
    // more tables ....
}}
...... sample 
DatabaseHelper databaseHelper = DatabaseHelper.getHelper(this);

编辑结束

SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("create TEMP table my_temp_table (id integer primary key, value text)"); // no exceptions

Cursor cursor = db.query("SQLITE_TEMP_MASTER", null, null, null, null, null, null);

while( cur.moveToNext()) {
    // no lines (no temporary tables)
}

如果我从 select 语句创建临时 table,然后查询(在同一个数据库连接中)创建的 table,我得到 "no such table .... exception"!

db.execSQL("create TEMP table my_temp_table as select * from my_table");
Cursor cursor = db.query("temp.my_temp_table", null, null, null, null, null, null);
^^^ no such table: temp.my_temp_table(code 1): , while compiling: SELECT * FROM temp.my_temp_table

让我感到困惑的是......相同的 sql 代码在 SQLiteStudio 中完美运行,即在应用程序外部和 android 设备外部。 也许我忘记启用某些东西或者...我需要特定的设备权限?

create temp table x 的结果是 table x 而不是 temp.x

更改代码以使用 my_temp_table

当您使用 db.enableWriteAheadLogging() 启用预写日志记录时,SQLiteDatabase 会自动多路复用数据库连接。用于 db.query(...) 的连接与用于 db.execSQL("CREATE TEMP TABLE ...").

的连接不同

您可以将 db.query(...) 包装在事务中并强制 SQLiteDatabase 使用与 execSQL 相同的连接。

db.beginTransaction();
Cursor cursor = db.query("temp.my_temp_table", null, null, null, null, null, null);
try {
    while (cursor.moveToNext()) {
        // ...
    }
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}