0

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

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

4

2 回答 2

1

您不能使用 AsyncTask 在构造函数中初始化数据库,尤其是因为在调用构造函数后立即调用

  BaseDados = DBHelper.getWritableDatabase();

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

我也认为像你所做的那样混合 UI 和 db 操作是不好的。你将不得不重新设计整个事情

于 2012-08-28T15:50:44.563 回答
1

您可能根本不需要显示进度对话框:

  1. 如果您的数据库创建时间足够短(大多数情况下),您可以同步进行。
  2. 如果没有,您可以嵌入一个预先存在的数据库并复制它。它更快,并且在文件副本上放置一个进度对话框非常简单。请参阅此示例以了解如何将数据库嵌入您的 apk 中:

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

于 2012-08-28T16:09:56.560 回答