Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite无法在“频繁”上打开数据库文件(代码14);选择";查询_Android_Sqlite_Singleton_Android Sqlite - Fatal编程技术网

Android SQLite无法在“频繁”上打开数据库文件(代码14);选择";查询

Android SQLite无法在“频繁”上打开数据库文件(代码14);选择";查询,android,sqlite,singleton,android-sqlite,Android,Sqlite,Singleton,Android Sqlite,我有以下类“Singleton”来处理SQLite连接,并确保整个流程/应用程序有一个连接实例: public class DBController { private static DBController instance = new DBController(); private static DBHelper dbHelper; public static DBController getInstance() { return instance; } pu

我有以下类“Singleton”来处理SQLite连接,并确保整个流程/应用程序有一个连接实例:

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类本身:

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);
  }
}
当我经常尝试从数据库中“选择”某些信息时,我收到以下错误:

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
}

如何管理/改进数据库连接以克服/避免此问题?

在执行任何查询之前(您应该打开数据库)。完成任务后关闭数据库

private DBHelper dbHelper = new DBHelper(context);

try {
    _db = dbHelper.getWritableDatabase();
} catch (SQLException s) {
    new Exception("Error with DB Open");
}
//那么现在就写下你的查询。。。。然后关闭数据库

_db.close();

每次调用
dbOpen()
时,您可以签出my

代码重新打开数据库

SQLite数据库对象非常轻量级;继续关闭和重新打开它是没有意义的


你已经有了单身汉;只需在那里存储一个
SQLiteDatabase
引用。

作为补充,我相信有太多的游标,从而打开,也会导致同样的“无法打开数据库文件错误”。(在下面的代码中,
shoplistcursor
中有507行,因此总共使用/重用了超过1500个光标)

我得到了同样的信息。根据:-

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) {
                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();
    }
出错的代码是:-

 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=getwriteabledatabase();
游标shoplistcursor=getAllRowsFromTable(SHOPLIST\u TABLE\u NAME);
企业社会责任;
阿列克斯尔;
游标prdusecsr;
while(shoplistcursor.moveToNext()){
productcsr=getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u PRODUCTREF));
aislecsr=getaislefromanisleid(shoplistcursor.getLong(shoplistcursor.getcolumnidex(SHOPLIST\u COLUMN\u AISLEREF));
prdusecsr=getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u AISLEREF)),
getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u PRODUCTREF));
if(productcsr.getCount()<1 | aislecsr.getCount()<1 | prdusecsr.getCount()<1){
deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u ID));
} 
if(shoplistcursor.isLast()){
prdusecsr.close();
aislecsr.close();
productcsr.close();
}
}
shoplistcursor.close();
db.close();
}
解决方法是在每次迭代时关闭游标。根据:-

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) {
                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();
    }
SQLiteDatabase db=getwriteabledatabase();
游标shoplistcursor=getAllRowsFromTable(SHOPLIST\u TABLE\u NAME);
企业社会责任;
阿列克斯尔;
游标prdusecsr;
while(shoplistcursor.moveToNext()){
productcsr=getProductFromProductId(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u PRODUCTREF));
aislecsr=getaislefromanisleid(shoplistcursor.getLong(shoplistcursor.getcolumnidex(SHOPLIST\u COLUMN\u AISLEREF));
prdusecsr=getProductUsage(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u AISLEREF)),
getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u PRODUCTREF));
if(productcsr.getCount()<1 | aislecsr.getCount()<1 | prdusecsr.getCount()<1){
productcsr.close();
aislecsr.close();
prdusecsr.close();
deleteShopListEntry(shoplistcursor.getLong(shoplistcursor.getColumnIndex(SHOPLIST\u COLUMN\u ID));
}否则{
productcsr.close();
aislecsr.close();
prdusecsr.close();
}
}
shoplistcursor.close();
db.close();
}

我正在使用游标进行一个大型查询,其中游标在800毫秒内通过三个单独的“查询”命中数据库超过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();

在你的申请课上

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();
        }
    }
}
在你的课堂上

 public DataSources() {
    database = ApplicationController.database;
 }

这样,您就可以创建一个可写的db对象一次

在哪里传递数据库路径?您可以看到此路径中有错误:
open(/data/user/0/uz.mycompany.myapp/databases/database.db journal)
。它应该类似于
/data/data/uz.mycompany.myapp/databases/database.db
@HrundiV.Bakshi感谢您的回复,我认为问题与数据库路径无关。。。由于我的应用程序正在运行,在频繁/经常(每2秒)执行getData()之前,一切都很好……当然,如果你不关闭它的话。但我希望你把打开的东西都关上,这不是个好主意
open,use,close
@Rotwang,它是在Jelly Bean上添加的,所以根据谷歌的统计,目前除了95%以上的安卓系统外,其他都是这样。谢谢你的回复。这可能会使我的应用程序有点不可预测,所以我的应用程序需要在不跳过的情况下处理对数据库的每个请求…或者我可以强制用户等待,直到数据库可以打开(使用您的解决方案)。。。但是它在用户体验方面会有效率吗?谢谢你的回复,我已经试过了。。。我添加了
if(writeabledb==null)writeabledb=dbHelper.getwriteabledatabase();返回可写数据库
dbOpen()
中,但应用程序似乎仍在尝试重新打开打开的数据库。。。我想我需要对此进行调查……当打开失败时,会得到堆栈跟踪。要么这一个没有通过singleton,要么singleton以前被删除了。我通过@MikeT的回答解决了我的问题,我也打开了cur