创建ProgressDialog
时显示database
的内容。这只显示一次。
我的活动中有这段代码:
baseDados.open();
ListView listContent = (ListView)findViewById(android.R.id.list);
Cursor query = baseDados.getData(1,0,null);
MyAdapt cursorAdapter = new MyAdapt(this, query,0);
listContent.setAdapter(cursorAdapter);
首次运行时,将创建并填充数据库,并在listview
上显示查询结果。使用上面的代码可以再次使用,但这次没有创建数据库,因为它已经创建了。
在互联网上,我看到最好的方法是使用AsyncTaks
,但如果我使用AsyncTaks
,我在显示progressdialog和创建数据库时出错时会遇到问题。
我已经创建了一个类来处理我的数据库,并创建了我的AsyncTaks
。
以下是我所做的:
public class Database {
private DbHelper DBHelper;
private final Context Context;
private SQLiteDatabase BaseDados;
static Context ctx;
private static class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, BD_NAME, null, BD_VERSION);
ctx = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
new loadDB().execute(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVesion) {
// Drop table if table exists
(....)
// creates new tables and data
onCreate(db);
}
public class loadDB extends AsyncTask<SQLiteDatabase, Void, Integer> {
ProgressDialog progresso;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progresso = ProgressDialog.show(ctx, "INFO", "Instaling for the first time") );
}
@Override
protected Integer doInBackground(SQLiteDatabase... params) {
SQLiteDatabase db = params[0];
// Code to create the tables and populate them
// Lots of code like below
db.execSQL("SQL statement goes here");
return 1;
}
@Override
protected void onPostExecute(Integer result) {
// Dismiss the ProgressDialog
progresso.dismiss();
super.onPostExecute(result);
}
}
}
public Database(Context c) {
Context = c;
}
public Database open() throws SQLException {
DBHelper = new DbHelper(Context);
BaseDados = DBHelper.getWritableDatabase();
return this;
}
public void close() {
DBHelper.close();
}
public Cursor getData(int tipo, long groupId, String query[]) {
// querys performed on the database
}
}
我有两个问题。
问题1
从不显示ProgressDialog,但创建和填充数据库需要将近五秒钟
问题2
在某些时候,应用程序崩溃并且数据库未正确创建,因为查询提供错误no such table
用于创建填充数据库的代码是正常的,因为如果在方法
@Override
public void onCreate(SQLiteDatabase db) {
new loadDB().execute(db);
}
我删除new loadDB().execute(db);
并将其放入:
@Override
public void onCreate(SQLiteDatabase db) {
// SQL code that was on `doInBackground(SQLiteDatabase... params)`
}
你能告诉我我做错了什么吗?
答案 0 :(得分:1)
你不能使用AsyncTask来初始化db里面的构造函数,特别是因为你在调用构造函数后立即调用
BaseDados = DBHelper.getWritableDatabase();
AsyncTask不会被运行,因此您的数据库不会被创建,但您正在尝试获取可写数据库。更好的设计是使与数据库相关的所有内容同步,然后在一个Asynctask中使用所有与db相关的方法。
此外,我认为像你一样混合UI和数据库操作是不好的。你将不得不重新设计整个事情
答案 1 :(得分:1)
您可能根本不需要显示progressdialog:
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/