写入服务中的数据库

时间:2015-03-29 00:24:54

标签: android sqlite android-service

在我的Android应用中,用户可以接收包含我想要存储在SQLite数据库中的序列号的通知。但是,我发现在Service内写入数据库可能不安全,因为它可以与当前Activity中的其他实例竞争。

Service内写入数据库真的不安全吗?有没有解决办法?

3 个答案:

答案 0 :(得分:1)

不,如果您使用相同的数据库连接实例,则不安全。

Reference

答案 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而不是回滚日志有利有弊。优点包括:

     
      
  1. 在大多数情况下,WAL明显更快。
  2.   
  3. WAL提供更多的并发性,因为读者不会阻止编写者,而编写者不会阻止读者。阅读和写作可以同时进行。
  4.   
  5. 使用WAL,磁盘I / O操作往往更顺序。
  6.   
  7. WAL使用更少的fsync()操作,因此在fsync()系统调用被破坏的系统上不易受到问题的影响。
  8.   

来源:https://www.sqlite.org/wal.html

Android(API级别11 +):

  

启用预写日志记录的最佳方法是通过   打开数据库的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();

来源 http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#enableWriteAheadLogging()