gpt4 book ai didi

java - 如何从另一个线程正确且适本地访问 SQLite 数据库 - Android

转载 作者:行者123 更新时间:2023-12-02 03:54:14 25 4
gpt4 key购买 nike

访问数据库应采取的正确方法。

所以我读了很多关于如何访问 SQLite 数据库(通过 SQLiteOpenHelper)的论坛 - 都有不同的答案。本质上,我有两个问题(问题):

    1. 在非 UI 线程的线程上访问数据库写入/或读取数据。我使用 AsyncTask、后台服务还是什么?我只是尝试从数据库中读取或写入,然后在 UI 中显示结果。

      • 简单的读/写操作是否应该在另一个线程中执行?如果是这样,使用的其他线程类型是否与问题 1 中使用的不同?

        public class ReadUsers extends AsyncTask<Void, Void, List<User>> {
        public void doInBackground(Void aVoid) {
        // Query the database here.
        }

        public void onPostExecute(List<User> users) {
        // Display the data obtained here.
        }
        }

最佳答案

1) 我认为 AsyncTask 可以工作,但我没有可用的示例。对于 SQLite DB 读/写,我几乎总是使用 Runnable(请参见下面的示例)。

2) 任何数据库操作都应该始终在另一个线程中完成,因为很有可能您的查询将花费足够长的时间来执行,以至于您的应用程序将因 UI 线程上无响应而失败(例如 3 秒?) 。关键是不要阻塞 UI 线程。但是,那么你必须有一个计划,当后台任务完成时,你如何更新 UI?请参阅下面示例中的 runOnUIThread 指令。

这是一个示例,首先如何调用您的方法:

        final Runnable searchWords = new Runnable() {
public void run() {
readWords();
}
};

Thread thread = new Thread(null, searchWords, "MagentoBackground");
thread.start();

然后是方法:

public void readWords() {

Edit.listOfWords = new ArrayList<Word>();

try {

myDbHelper.openDataBase();

}catch(SQLException sqle){

throw sqle;

}

Cursor c = null;

try{

boolean containsPct = mSearch.contains("%");

if (containsPct) {
c = myDbHelper.searchEnableWords(mSearch);
} else {
String sLength = "" + mSearch.length();
c = myDbHelper.getEnableWords(mSearch, sLength);
}

if (c.moveToFirst())
{

do {

Word word = new Word();

word.word = c.getString(0);
word.length = word.word.length();
word.value = wordValue(word.word);
Edit.listOfWords.add(word);

} while (c.moveToNext());
}

if (c != null) {
if (!c.isClosed()) {
c.close();
}
}


} catch (Throwable t){
Log.e("Word Assist",t.getMessage(),t);

if (c != null) {
if (!c.isClosed()) {
c.close();
}
}

}

try {

myDbHelper.close();

}catch(SQLException sqle){

throw sqle;

}

Collections.sort(Edit.listOfWords, new WordComparator());
adapter = new WordAdapter(this, Edit.listOfWords);


runOnUiThread(returnRes);

}

然后在 UI 线程上执行您需要的操作:

private Runnable returnRes = new Runnable() {
@Override
public void run() {

mProgressDialog.dismiss();
list.setAdapter(adapter);

if (Edit.listOfWords.size() == 0) {
empty.setVisibility(View.VISIBLE);
} else {
empty.setVisibility(View.GONE);
}


}

};

这是一个 AsyncTask 示例:

private class GetPetDetails extends AsyncTask<String, Void, String> {
ProgressDialog dialog;

@Override
protected void onPreExecute() {

dialog = new ProgressDialog(thisContext);
dialog.setMessage("Loading, please wait...");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();


}

protected String doInBackground(String... urls) {

String animal_breed = urls[0];
String results = "";

try{

results = myDbHelper.getBreedDetails(animal_breed);

} catch (Throwable t){
Log.e("VCAS",t.getMessage(),t);
}

return results;
}

protected void onPostExecute(String results) {
dialog.dismiss();

breedDetails = results;
displayDetail();



}

}//

关于java - 如何从另一个线程正确且适本地访问 SQLite 数据库 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56760762/

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