SQLite多次访问造成的error

该日志记录了Android应用程序尝试打开名为test.db的数据库文件时遇到的问题,错误代码14表明无法打开文件,可能的原因包括文件权限问题、磁盘空间不足或文件系统错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11-21 15:12:06.440: I/SqliteDatabaseCpp(16755): sqlite returned: error code = 14, msg = cannot open file at line 27703 of [8609a15dfa], db=/data/data/com.test.test/databases/test.db
11-21 15:12:06.440: I/SqliteDatabaseCpp(16755): sqlite returned: error code = 14, msg = os_unix.c: open() at line 27703 - "" errno=24 path=/data/data/com.test.test/databases/test.db, 
db=/data/data/com.test.test/databases/test.db
11-21 15:12:06.440: E/SqliteDatabaseCpp(16755): sqlite3_open_v2("/data/data/com.test.test/databases/test.db", &handle, 6, NULL) failed
11-21 15:12:06.460: E/SQLiteDatabase(16755): Failed to open the database. closing it.
11-21 15:12:06.460: E/SQLiteDatabase(16755): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
11-21 15:12:06.460: E/SQLiteDatabase(16755): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1017)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:990)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1055)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:803)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at com.test.helper.DataHelper.<init>(DataHelper.java:34)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at com.test.function.IntercomActivity.OnlineUserID(IntercomActivity.java:444)
11-21 15:12:06.460: E/SQLiteDatabase(16755): at com.test.function.IntercomActivity$10.run(IntercomActivity.java:436)
11-21 15:12:06.460: W/dalvikvm(16755): threadid=332: thread exiting with uncaught exception (group=0x40aac210)
11-21 15:12:06.470: E/AndroidRuntime(16755): FATAL EXCEPTION: Thread-1116
11-21 15:12:06.470: E/AndroidRuntime(16755): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
11-21 15:12:06.470: E/AndroidRuntime(16755): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
11-21 15:12:06.470: E/AndroidRuntime(16755): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1017)
11-21 15:12:06.470: E/AndroidRuntime(16755): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:990)
11-21 15:12:06.470: E/AndroidRuntime(16755): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1055)
11-21 15:12:06.470: E/AndroidRuntime(16755): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:803)
11-21 15:12:06.470: E/AndroidRuntime(16755): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
11-21 15:12:06.470: E/AndroidRuntime(16755): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
11-21 15:12:06.470: E/AndroidRuntime(16755): at com.test.helper.DataHelper.<init>(DataHelper.java:34)
11-21 15:12:06.470: E/AndroidRuntime(16755): at com.test.function.IntercomActivity.OnlineUserID(IntercomActivity.java:444)

11-21 15:12:06.470: E/AndroidRuntime(16755): at com.test.function.IntercomActivity$10.run(IntercomActivity.java:436)

======================================================================================================

11-21 13:46:12.980: E/SQLiteLog(3331): (14) cannot open file at line 30245 of [00bb9c9ce4]
11-21 13:46:12.980: E/SQLiteLog(3331): (14) os_unix.c:30245: (24) open(/data/data/com.test.test/databases/test.db-journal) - 
11-21 13:46:12.980: E/SQLiteLog(3331): (14) cannot open file at line 30245 of [00bb9c9ce4]
11-21 13:46:12.990: E/SQLiteLog(3331): (14) os_unix.c:30245: (24) open(/data/data/com.test.test/databases/test.db-journal) - 
11-21 13:46:12.990: E/SQLiteLog(3331): (14) unable to open database file
11-21 13:46:12.990: E/SQLiteLog(3331): (14) cannot open file at line 30245 of [00bb9c9ce4]
11-21 13:46:12.990: E/SQLiteLog(3331): (14) os_unix.c:30245: (24) open(/data/data/com.test.test/databases/test.db-journal) - 
11-21 13:46:12.999: E/SQLiteLog(3331): (14) cannot open file at line 30245 of [00bb9c9ce4]
11-21 13:46:12.999: E/SQLiteLog(3331): (14) os_unix.c:30245: (24) open(/data/data/com.test.test/databases/test.db-journal) - 
11-21 13:46:12.999: E/SQLiteLog(3331): (14) unable to open database file
11-21 13:46:13.029: E/SQLiteDatabase(3331): Failed to open database '/data/data/com.test.test/databases/test.db'.
11-21 13:46:13.029: E/SQLiteDatabase(3331): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14): , while compiling: PRAGMA journal_mode
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1013)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:758)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:444)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:418)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:324)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:464)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:186)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:918)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:232)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at com.test.helper.DataHelper.<init>(DataHelper.java:34)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at com.test.function.IntercomActivity.OnlineUserID(IntercomActivity.java:444)
11-21 13:46:13.029: E/SQLiteDatabase(3331): at com.test.function.IntercomActivity$10.run(IntercomActivity.java:436)
11-21 13:46:13.029: W/dalvikvm(3331): threadid=336: thread exiting with uncaught exception (group=0x41ebf438)
11-21 13:46:13.049: E/AndroidRuntime(3331): FATAL EXCEPTION: Thread-778
11-21 13:46:13.049: E/AndroidRuntime(3331): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14): , while compiling: PRAGMA journal_mode
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1013)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:758)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:444)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:418)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:324)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:464)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:186)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:918)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:232)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
11-21 13:46:13.049: E/AndroidRuntime(3331): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
11-21 13:46:13.049: E/AndroidRuntime(3331): at com.test.helper.DataHelper.<init>(DataHelper.java:34)
11-21 13:46:13.049: E/AndroidRuntime(3331): at com.test.function.IntercomActivity.OnlineUserID(IntercomActivity.java:444)
11-21 13:46:13.049: E/AndroidRuntime(3331): at com.test.function.IntercomActivity$10.run(IntercomActivity.java:436)

### 如何优化嵌入式 SQLite3 数据库的访问性能 #### 减少磁盘 I/O 操作 频繁的磁盘读写会显著降低数据库性能。为了减少不必要的磁盘I/O操作,可以通过批量处理事务来实现。每次提交事务时都会触发一次同步到磁盘的操作,因此应尽可能多地在一个事务内完成多项更新。 ```c // 批量插入数据示例 rc = sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, &zErrMsg); if (rc != SQLITE_OK){ fprintf(stderr, "SQL error: %s\n", zErrMsg); } for(i=0;i<NUM_RECORDS;++i){ snprintf(sql,sizeof sql,"INSERT INTO table_name VALUES (%d)", i); rc = sqlite3_exec(db,sql,NULL,NULL,&zErrMsg); if( rc!=SQLITE_OK ){ break; } } rc = sqlite3_exec(db, "COMMIT;", NULL, NULL, &zErrMsg); ``` #### 使用预编译语句 对于重复执行相同的查询或命令而言,使用`sqlite3_prepare_v2()`准备好的SQL语句能够提高效率。这不仅减少了解析时间还允许参数化输入从而防止SQL注入攻击。 ```c const char* sql ="SELECT * FROM my_table WHERE column=?;"; sqlite3_stmt *stmt; /* Prepare the statement */ rc = sqlite3_prepare_v2(db, sql,-1 ,&stmt ,NULL ); while(SQLITE_ROW == sqlite3_step(stmt)){ /* Process each row here */ } /* Finalize the prepared statement when done */ sqlite3_finalize(stmt); ``` #### 调整缓存大小 适当调整页面缓存数量可改善内存中保存的数据页数目进而加快检索过程。可通过PRAGMA指令修改默认值: ```sql PRAGMA cache_size=-2000; -- 设置为负数表示以KB计 ``` #### 启用WAL模式 启用Write-Ahead Logging(WAL)日志记录方式可以在多读者单写者场景下获得更好的并发性和更短的锁定周期。切换至WAL模式只需一条简单的SQL命令即可生效: ```sql PRAGMA journal_mode=WAL; ``` #### 避免自动索引创建 除非确实必要,否则不应依赖于SQLite自动生成索引来加速某些类型的JOIN操作。因为这些隐式的索引可能会占用额外的空间并且拖慢整体表现。应当显式定义所需的索引结构。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值