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();
}
我想在 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();
}