gpt4 book ai didi

Android AsyncTask 和 SQLite 数据库实例

转载 作者:IT王子 更新时间:2023-10-29 06:22:13 27 4
gpt4 key购买 nike

我有一个问题,我不确定如何解决它。我的应用程序中的一个 Activity 有多个 AsyncTask,它们访问单个 SQLiteOpenHelper。我在 onCreate() 中初始化并打开助手,然后在 onStop() 中关闭它。我还检查它是否已在 onResume() 中初始化。

自从我发布了我的应用程序后,我在 doInBackground 中收到了很多错误,其中我尝试访问 DB 帮助程序。我知道发生这种情况是因为数据库在 doInBackground 被调用之前关闭 ( onStop() ),很公平。

我的问题是,我应该在哪里关闭数据库连接?在 Activity 中使用 DB helper 的单个实例并从多个线程(AsyncTasks)访问它是否正确?或者我应该为每个 AsyncTask 使用单独的数据库助手实例?

这是我的 Activity 的简化骨架:

public class MyActivity extends Activity{
private DbHelper mDbHelper;
private ArrayList<ExampleObject> objects;

@Override
public void onStop(){
super.onStop();
if(mDbHelper != null){
mDbHelper.close();
mDbHelper = null;
}
}

@Override
public void onResume(){
super.onResume();
if(mDbHelper == null){
mDbHelper = new DbHelper(this);
mDbHelper.open();
}
}

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
DbHelper mDbHelper = new DbHelper(this);
mDbHelper.open();
}

private class DoSomething extends AsyncTask<String, Void, Void> {

@Override
protected Void doInBackground(String... arg0) {
objects = mDbHelper.getMyExampleObjects();
return null;
}

@Override
protected void onPostExecute(final Void unused){
//update UI with my objects
}
}

private class DoSomethingElse extends AsyncTask<String, Void, Void> {

@Override
protected Void doInBackground(String... arg0) {
objects = mDbHelper.getSortedObjects();
return null;
}

@Override
protected void onPostExecute(final Void unused){
//update UI with my objects
}
}
}

最佳答案

您不需要为每个 Activity 管理数据库连接。您可以在 android.app.Application 的实例中执行此操作并使用此实例访问数据库。像这样:

public class MyApplication extends Application {

// Synchronized because it's possible to get a race condition here
// if db is accessed from different threads. This synchronization can be optimized
// thought I wander if it's necessary
public synchronized static SQLiteDatabase db() {
if(self().mDbOpenHelper == null) {
self().mDbOpenHelper = new MyDbOpenHelper();
}
return self().mDbOpenHelper.getWritableDatabase();
}

public static Context context() {
return self();
}

@Override
public void onCreate() {
super.onCreate();
mSelf = this;
}

private static MyApplication self() {
if (self == null) throw new IllegalStateException();
return mSelf;
}

private MyDbOpenHelper mDbOpenHelper;

private static MyApplication mSelf;
}

这样您就可以确保您的 Db 始终可以访问。

是的,拥有一个 Db 助手实例是一种很好的做法。默认情况下为您进行线程同步。

关于Android AsyncTask 和 SQLite 数据库实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7514021/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com