ProgressDialog
创建my 时显示的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
.
我创建了一个类来处理我的数据库,并在那里创建了我的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)`
}
你能告诉我我做错了什么吗?