SQLite 无法在频繁 "SELECT" 查询时打开数据库文件(代码 14)
SQLite unable to open database file (code 14) on frequent "SELECT" query
我有以下 class "Singleton" 来处理 SQLite 连接并确保整个连接有 1 个实例 process/app:
public class DBController {
private static DBController instance = new DBController();
private static DBHelper dbHelper;
public static DBController getInstance()
{
return instance;
}
public SQLiteDatabase dbOpen(Context context)
{
if(dbHelper == null)
dbHelper = new DBHelper(context);
return dbHelper.getWritableDatabase();
}
}
和 DBHelper class 本身:
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "database.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
final String position = "CREATE TABLE test (" +
"test TEXT NOT NULL);";
db.execSQL(position);
}
}
当我经常尝试"SELECT"来自数据库的一些信息时,我收到以下错误:
SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
SQLiteLog: (14) os_unix.c:31278: (24) open(/data/user/0/uz.mycompany.myapp/databases/database.db-journal) -
SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
SQLiteLog: (14) os_unix.c:31278: (24) open(/data/user/0/uz.mycompany.myapp/databases/database.db-journal) -
SQLiteLog: (14) statement aborts at 29: [SELECT * FROM test WHERE test='testdata1'] unable to open database file
SQLiteQuery: exception: unable to open database file (code 14); query: SELECT * FROM test WHERE test='testdata1'
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
我正在运行以下代码执行查询:
public String getData(Context context)
{
SQLiteDatabase _db = dbOpen(context);
Cursor c = _db.rawQuery("SELECT * FROM test WHERE test='testdata1'", null);
return getDataFromCursor(c).get(0); //gets data from cursor and returns first one
}
我如何manage/improve我的数据库连接到overcome/avoid这个问题?
在对这些东西执行任何查询之前(你应该打开你的数据库)。完成任务后关闭数据库。
private DBHelper dbHelper = new DBHelper(context);
try {
_db = dbHelper.getWritableDatabase();
} catch (SQLException s) {
new Exception("Error with DB Open");
}
// 然后现在写你的查询....然后关闭数据库。
_db.close();
你的代码re-opens数据库每次dbOpen()
被调用。
SQLite 数据库对象非常轻量级;继续关闭并 re-opening 它真的没有意义。
您已经有了单身人士;只需在此处存储一个 SQLiteDatabase
引用。
另外,我认为游标太多,因此打开的游标也可能导致相同的结果 "unable to open database file error"。 (在下面的代码中,shoplistcursor
中有507行,所以就结束了1500 个游标 used/reused 总共 )
我收到了同样的信息。根据 :-
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) cannot open file at line 30046 of [9491ba7d73]
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) os_unix.c:30046: (24) open(/data/data/mjt.shopper/databases/Shopper-journal) -
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) cannot open file at line 30046 of [9491ba7d73]
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) os_unix.c:30046: (24) open(/data/data/mjt.shopper/databases/Shopper-journal) -
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) statement aborts at 24: [SELECT * FROM productusage WHERE productailseref = 60 AND productproductref = 75 ;] unable to open database file
10-29 19:57:00.902 12845-12845/mjt.shopper E/SQLiteQuery: exception: unable to open database file (code 14); query: SELECT * FROM productusage WHERE productailseref = 60 AND productproductref = 75 ;
10-29 19:57:00.902 12845-12845/mjt.shopper D/AndroidRuntime: Shutting down VM
10-29 19:57:00.903 12845-12845/mjt.shopper E/AndroidRuntime: FATAL EXCEPTION: main
错误的代码是:-
SQLiteDatabase db = getWritableDatabase();
Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
Cursor productcsr;
Cursor aislecsr;
Cursor prdusecsr;
while(shoplistcursor.moveToNext()) {
productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
}
if(shoplistcursor.isLast()) {
prdusecsr.close();
aislecsr.close();
productcsr.close();
}
}
shoplistcursor.close();
db.close();
}
解决方法是在每次迭代时关闭游标。根据 :-
SQLiteDatabase db = getWritableDatabase();
Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
Cursor productcsr;
Cursor aislecsr;
Cursor prdusecsr;
while(shoplistcursor.moveToNext()) {
productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
productcsr.close();
aislecsr.close();
prdusecsr.close();
deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
} else {
productcsr.close();
aislecsr.close();
prdusecsr.close();
}
}
shoplistcursor.close();
db.close();
}
我正在使用游标进行大型查询,其中游标在 800 毫秒内通过三个单独的 'QUERY' 访问数据库超过 1350 次。所以我得到了错误(android.database.sqlite.SQLiteCantOpenDatabaseException:无法打开数据库文件(代码 14))。我通过在开始新查询之前关闭游标来解决它。这解决了我的问题。希望它能处理比我的更大的查询。
String data_query = "SELECT * FROM test WHERE id= " + c_id + " AND memberId = " + memberId;
Cursor cu_cu = userHelper.getData(data_query);
float cu_cu_count = cu_cu.getCount();
System.out.println("ALL ANSWER COUNT : " + cu_cu_count);
cu_cu.close();
在你的申请中class
public static SQLiteDatabase database;
@Override
public void onCreate() {
super.onCreate();
SQLiteOpenHelper helper = Database.getInstance(getApplicationContext());
if (database == null) {
database = helper.getWritableDatabase();
} else {
if (!database.isOpen()) {
database = helper.getWritableDatabase();
}
}
}
在您的查询中class
public DataSources() {
database = ApplicationController.database;
}
这样你就创建了一个可写的数据库对象一次
我有以下 class "Singleton" 来处理 SQLite 连接并确保整个连接有 1 个实例 process/app:
public class DBController {
private static DBController instance = new DBController();
private static DBHelper dbHelper;
public static DBController getInstance()
{
return instance;
}
public SQLiteDatabase dbOpen(Context context)
{
if(dbHelper == null)
dbHelper = new DBHelper(context);
return dbHelper.getWritableDatabase();
}
}
和 DBHelper class 本身:
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "database.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
final String position = "CREATE TABLE test (" +
"test TEXT NOT NULL);";
db.execSQL(position);
}
}
当我经常尝试"SELECT"来自数据库的一些信息时,我收到以下错误:
SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
SQLiteLog: (14) os_unix.c:31278: (24) open(/data/user/0/uz.mycompany.myapp/databases/database.db-journal) -
SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
SQLiteLog: (14) os_unix.c:31278: (24) open(/data/user/0/uz.mycompany.myapp/databases/database.db-journal) -
SQLiteLog: (14) statement aborts at 29: [SELECT * FROM test WHERE test='testdata1'] unable to open database file
SQLiteQuery: exception: unable to open database file (code 14); query: SELECT * FROM test WHERE test='testdata1'
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
我正在运行以下代码执行查询:
public String getData(Context context)
{
SQLiteDatabase _db = dbOpen(context);
Cursor c = _db.rawQuery("SELECT * FROM test WHERE test='testdata1'", null);
return getDataFromCursor(c).get(0); //gets data from cursor and returns first one
}
我如何manage/improve我的数据库连接到overcome/avoid这个问题?
在对这些东西执行任何查询之前(你应该打开你的数据库)。完成任务后关闭数据库。
private DBHelper dbHelper = new DBHelper(context);
try {
_db = dbHelper.getWritableDatabase();
} catch (SQLException s) {
new Exception("Error with DB Open");
}
// 然后现在写你的查询....然后关闭数据库。
_db.close();
你的代码re-opens数据库每次dbOpen()
被调用。
SQLite 数据库对象非常轻量级;继续关闭并 re-opening 它真的没有意义。
您已经有了单身人士;只需在此处存储一个 SQLiteDatabase
引用。
另外,我认为游标太多,因此打开的游标也可能导致相同的结果 "unable to open database file error"。 (在下面的代码中,shoplistcursor
中有507行,所以就结束了1500 个游标 used/reused 总共 )
我收到了同样的信息。根据 :-
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) cannot open file at line 30046 of [9491ba7d73]
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) os_unix.c:30046: (24) open(/data/data/mjt.shopper/databases/Shopper-journal) -
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) cannot open file at line 30046 of [9491ba7d73]
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) os_unix.c:30046: (24) open(/data/data/mjt.shopper/databases/Shopper-journal) -
10-29 19:57:00.901 12845-12845/mjt.shopper E/SQLiteLog: (14) statement aborts at 24: [SELECT * FROM productusage WHERE productailseref = 60 AND productproductref = 75 ;] unable to open database file
10-29 19:57:00.902 12845-12845/mjt.shopper E/SQLiteQuery: exception: unable to open database file (code 14); query: SELECT * FROM productusage WHERE productailseref = 60 AND productproductref = 75 ;
10-29 19:57:00.902 12845-12845/mjt.shopper D/AndroidRuntime: Shutting down VM
10-29 19:57:00.903 12845-12845/mjt.shopper E/AndroidRuntime: FATAL EXCEPTION: main
错误的代码是:-
SQLiteDatabase db = getWritableDatabase();
Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
Cursor productcsr;
Cursor aislecsr;
Cursor prdusecsr;
while(shoplistcursor.moveToNext()) {
productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
}
if(shoplistcursor.isLast()) {
prdusecsr.close();
aislecsr.close();
productcsr.close();
}
}
shoplistcursor.close();
db.close();
}
解决方法是在每次迭代时关闭游标。根据 :-
SQLiteDatabase db = getWritableDatabase();
Cursor shoplistcursor = getAllRowsFromTable(SHOPLIST_TABLE_NAME);
Cursor productcsr;
Cursor aislecsr;
Cursor prdusecsr;
while(shoplistcursor.moveToNext()) {
productcsr = getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
aislecsr = getAisleFromAisleId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)));
prdusecsr = getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_AISLEREF)),
shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_PRODUCTREF)));
if (productcsr.getCount() < 1 | aislecsr.getCount() < 1 | prdusecsr.getCount() < 1) {
productcsr.close();
aislecsr.close();
prdusecsr.close();
deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST_COLUMN_ID)));
} else {
productcsr.close();
aislecsr.close();
prdusecsr.close();
}
}
shoplistcursor.close();
db.close();
}
我正在使用游标进行大型查询,其中游标在 800 毫秒内通过三个单独的 'QUERY' 访问数据库超过 1350 次。所以我得到了错误(android.database.sqlite.SQLiteCantOpenDatabaseException:无法打开数据库文件(代码 14))。我通过在开始新查询之前关闭游标来解决它。这解决了我的问题。希望它能处理比我的更大的查询。
String data_query = "SELECT * FROM test WHERE id= " + c_id + " AND memberId = " + memberId;
Cursor cu_cu = userHelper.getData(data_query);
float cu_cu_count = cu_cu.getCount();
System.out.println("ALL ANSWER COUNT : " + cu_cu_count);
cu_cu.close();
在你的申请中class
public static SQLiteDatabase database;
@Override
public void onCreate() {
super.onCreate();
SQLiteOpenHelper helper = Database.getInstance(getApplicationContext());
if (database == null) {
database = helper.getWritableDatabase();
} else {
if (!database.isOpen()) {
database = helper.getWritableDatabase();
}
}
}
在您的查询中class
public DataSources() {
database = ApplicationController.database;
}
这样你就创建了一个可写的数据库对象一次