7

我创建了一个使用 db 对象的单个实例的 databaseprovider 类。对象在主活动中创建并关闭 onDestroy 方法。这似乎没问题(但会出现一些错误,例如:数据库已关闭或数据库未在我无法模拟的某些用户设备上打开)。

我想向应用程序添加一项服务以进行内容下载,并且该服务可以与调度程序一起运行,这让我认为 db 对象的单个实例将不起作用。我应该为服务使用另一个对象,这会导致一致性问题吗?您能否建议最好的方法是什么?

数据库提供者类 exm:

public class DatabaseProvider {
private static DatabaseHelper helperWriter;
public static SQLiteDatabase db_global;
public DatabaseProvider(Context c) {
    helperWriter = DatabaseHelper.getHelper(c, true);
}

private static SQLiteDatabase getDB() {     

    if(db_global == null)           
        db_global = helperWriter.getWritableDatabase();
    else if(!db_global.isOpen()) {
        try {
            db_global.close();
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
        db_global = helperWriter.getWritableDatabase();
    }

    return db_global;
}

public String GetVersion() {
    SQLiteDatabase db = getDB();
    Cursor c = db.query(DatabaseHelper.PARAMETER_TABLE_NAME, new String[] {"VALUE"}, "KEY='Version'", null, null,null,null);
    String version = "";
    if(c.moveToNext())
    {
        version = c.getString(0);           
    }
    else
        version = "0";
    c.close();

    return version;
}

public long UpdateVersion(String value) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(DatabaseHelper.PARAMETER_COLUMN_VALUE, value);
    SQLiteDatabase db = getDB();   
    long r = db.update(DatabaseHelper.PARAMETER_TABLE_NAME, initialValues, "KEY='Version'", null);
    if(r <= 0)
        r = helperWriter.AddParameter(db, "Version", value);
    //db.close();   
    return r;
}   

public void CloseDB() {
    if (db_global != null)
        db_global.close();
    db_global = null;
    helperWriter.close();
}
 }

4

2 回答 2

1

不确定这是否会有所帮助,但是...

如果应用程序崩溃,您不能依赖 onDestroy() 。即使您退出,Android 也可能会将您的应用程序保留在 RAM 中。此外,如果您处于子活动中,则在使用应用程序时,您的主要活动可能会被破坏。它也可以被重新创建。

有时最好让调用打开数据库,对其进行处理,然后在同一个函数中关闭它。如果您使用的是服务,它实际上可能会有所帮助。我也不确定您是否应该在没有一些管理代码的情况下一次打开和/或从各种不同的地方访问数据库

于 2012-09-20T18:32:22.427 回答
0

我看到几个问题:

一个)

(但会出现一些错误,例如:数据库已关闭或数据库未在我无法模拟的某些用户设备上打开)。... 启动一个活动,然后在 AsyncTask 中更新内容和一些数据库操作。在更新过程中返回并再次开始相同的活动。

要解决这些错误,您是否考虑过使用[Loader][1]? ContentProvider它是一个围绕s 的基于回调的框架。


二)

将服务添加到应用程序以进行内容下载,并且该服务可以与调度程序一起运行,这让我认为 db 对象的单个实例将不起作用。我应该为服务使用另一个对象,这会导致一致性问题吗?

此网站上@commonsware的这篇文章建议不要Service用于长时间运行的任务。相反,AlarmManager建议。我自己只使用过短期运行服务(用于音频 IO)。

于 2012-11-28T05:18:53.320 回答