2016-03-03 7 views
0

Я использую com.j256.ormlite: ormlite-android: 4.48 на Android.Android SQLiteDatabaseLockedException с ormlite

Я использую OrmLiteSqliteOpenHelper с одноэлементным шаблоном (всего один экземпляр для всего приложения).

Я написал тестовое приложение (используя несколько AsyncTask с операциями чтения/создания/обновления ), и он отлично работает, даже проверяет его в режиме деблокирования.

Он отлично работает на фактическом производстве/выпуске на моем телефоне (Samsung S3 и Mi4i), но иногда я получаю отчет об ошибке с SQLiteDatabaseLockedException от других пользователей.

Интересно, я сделал что-то не так, или SQLite имеют разные непредсказуемые поведения на разных телефонах Android?

Ниже приведены некоторые из моего кода:

public class DbHelper extends OrmLiteSqliteOpenHelper { 
    private static final String DATABASE_NAME = "test.db"; 
    private static final int DATABASE_VERSION = 1; 

    private Dao<ModelA, String> modelADao = null; 

    public DbHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config); 
    // this.context = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { 
    try { 
     TableUtils.createTable(connectionSource, ModelA.class); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) { 

    } 

    public Dao<ModelA, String> getModelADao() throws SQLException { 
    if (modelADao == null) { 
     modelADao = getDao(ModelA.class); 
    } 
    return modelADao; 
    } 
} 

@DatabaseTable(tableName = "model_a") 
public class ModelA { 
    @DatabaseField(id = true, columnName = "_id") 
    public String id; 

    @DatabaseField(columnName = "created") 
    public Date created; 

    @DatabaseField(columnName = "name") 
    public String name; 

    @DatabaseField(columnName = "age") 
    public int age; 

    @DatabaseField(columnName = "is_active") 
    public boolean isActive; 
} 

public class App { 
    public static final String TAG = App.class.getName(); 

    private static DbHelper dbHelper; 

    public synchronized static DbHelper buildDbHelper(Context context) { 
    if (dbHelper == null) { 
     Log.d(TAG, "buildDbHelper"); 
     dbHelper = OpenHelperManager.getHelper(context, DbHelper.class); 
    } 
    return dbHelper; 
    } 

    public static DbHelper getDbHelper() { 
    if (dbHelper == null) { 
     Log.e(TAG, "getDbHelper=null"); 
    } 
    return dbHelper; 
    } 
} 

# Read 
List<ModelA> items = App.getDbHelper().getModelADao().queryForAll(); 

# Create 
Dao<ModelA, String> dao = App.getDbHelper().getModelADao(); 
ModelA item = new ModelA(); 
item.id = UUID.randomUUID().toString(); 
item.name = item.id; 
item.created = Calendar.getInstance().getTime(); 
item.age = rand.nextInt(100); 
dao.create(item); 

ответ

0

Такого рода исключение обычно происходит, когда вы создаете более, чем один раз экземпляр класса базы данных и более одного экземпляра пытается получить доступ к базе данных, в то же time.Try используя подход Singleton, он определенно решит вашу проблему. Сообщите мне, если вам нужна помощь. счастливое кодирование :) Отметьте это, если это поможет.

+0

Я использовал подход SIngleton, как показано в моем коде выше :( –