使用AsyncTask创建数据库时的Android ProgressDialog

时间:2012-08-28 15:29:09

标签: android database android-asynctask progressdialog

创建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)`
}

你能告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

你不能使用AsyncTask来初始化db里面的构造函数,特别是因为你在调用构造函数后立即调用

  BaseDados = DBHelper.getWritableDatabase();

AsyncTask不会被运行,因此您的数据库不会被创建,但您正在尝试获取可写数据库。更好的设计是使与数据库相关的所有内容同步,然后在一个Asynctask中使用所有与db相关的方法。

此外,我认为像你一样混合UI和数据库操作是不好的。你将不得不重新设计整个事情

答案 1 :(得分:1)

您可能根本不需要显示progressdialog:

  1. 如果您的数据库创建足够短(大多数情况),您可以同步执行。
  2. 如果没有,您可以嵌入预先存在的数据库并进行复制。它更快,将progressdialog放在文件副本上非常简单。请参阅此示例,了解如何在apk中嵌入数据库:
  3. http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/