在我的Android应用中,用户可以接收包含我想要存储在SQLite数据库中的序列号的通知。但是,我发现在Service
内写入数据库可能不安全,因为它可以与当前Activity
中的其他实例竞争。
在Service
内写入数据库真的不安全吗?有没有解决办法?
答案 0 :(得分:1)
不,如果您使用相同的数据库连接实例,则不安全。
答案 1 :(得分:0)
我不知道你的意思是什么“因为它可以与其他实例竞争”。只需使用一种方法创建一个服务,该方法可以在需要时更新数据库并启动它(并在作业完成后立即停止)。
答案 2 :(得分:0)
将SQLiteOpenHelper实现为单例。
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static MyDatabaseHelper instance;
public static MyDatabaseHelper getInstance(Context context){
if ( instance == null ){
instance = new MyDatabaseHelper(context);
}
return instance;
}
}
了解SQLite预写日志记录
使用WAL而不是回滚日志有利有弊。优点包括:
- 在大多数情况下,WAL明显更快。
- WAL提供更多的并发性,因为读者不会阻止编写者,而编写者不会阻止读者。阅读和写作可以同时进行。
- 使用WAL,磁盘I / O操作往往更顺序。
- WAL使用更少的fsync()操作,因此在fsync()系统调用被破坏的系统上不易受到问题的影响。
醇>
来源:https://www.sqlite.org/wal.html
启用预写日志记录的最佳方法是通过 打开数据库的ENABLE_WRITE_AHEAD_LOGGING标志(String, SQLiteDatabase.CursorFactory,int)。这比效率更高 调用enableWriteAheadLogging()。
SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory,
SQLiteDatabase.CREATE_IF_NECESSARY |
SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING,
myDatabaseErrorHandler);
db.enableWriteAheadLogging();