Android获取数据库中的上下文

时间:2012-08-24 16:45:23

标签: android database android-context

我有一个数据库,我创建了一个Database类,其中有一个private static class DbHelper extends SQLiteOpenHelper来帮助我管理我的数据库。

此数据库可以从四种不同的活动中访问。

我有这个public void onCreate(SQLiteDatabase db),它创建了我的数据库表并为这些表添加了值。由于程序仅在用户第一次运行应用程序时进入此处,因此我想创建ProgressDialog

这就是我所拥有的:

Override
public void onCreate(SQLiteDatabase db) {

    ProgressDialog progresso = ProgressDialog.show(context, "Info", "Loading DB" );
    // Code to create the tables and add the values
    progress.dismiss();
}

有2个问题。

首先:

由于可以从4个不同的活动中访问,我如何获取上下文? 制作:

Context context = getAplicationContext();

第二

为什么我不能使用strings.xml中的字符串? 我不能这样做:

ProgressDialog progresso = ProgressDialog.show(context, getString(R.string.driProgressTitle), getString(R.string.driProgressMessage) );

更新

public class Database {
    ProgressDialog progresso;
    private DbHelper DBHelper;
    private final Context Context;
    private SQLiteDatabase BaseDados;

    private static class DbHelper extends SQLiteOpenHelper {

        public DbHelper(Context context) {
            super(context, BD_NAME, null, BD_VERSION);
            // TODO Auto-generated method stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

        // Whanted to show here the progress dialog
        new loadDB().execute();

        // Creates the table and adds the values

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVesion) {
            db.execSQL("DROP TABLE IF EXISTS MYTABLE");
            onCreate(db);
        }

    }

    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[]) {
        // Performs the querys to my database
    }
    return null;
}

    public class loadDB extends AsyncTask<Void, Void, Integer> {

        @Override
        protected Integer doInBackground(Void... params) {
            progresso = ProgressDialog.show(Context, Context.getString(R.string.ProgressTitle), Context.getString(R.string.ProgressMessage) );
            return 1;
        }

        @Override
        protected void onPostExecute(Integer result) {
            progresso.dismiss();
            super.onPostExecute(result);
        }
    }
}

使用上面的代码我在No enclosing instance of type Database is accessible. Must qualify the allocation with an enclosing instance of type Database (e.g. x.new A() where x is an instance of Database).中收到此错误new loadDB().execute();

5 个答案:

答案 0 :(得分:7)

您是否可以从构造函数访问Context?

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) 

修改

您的代码:

public DbHelper(Context context) {
        super(context, BD_NAME, null, BD_VERSION);
        // TODO Auto-generated method stub
    }

此时你可以访问上下文..你可以做一些事情,比如添加一个叫做上下文的字段然后这样做:

Context context;
public DbHelper(Context context) {
        super(context, BD_NAME, null, BD_VERSION);
        // TODO Auto-generated method stub
        this.context = context;
    }

现在,您可以访问班级中的任何位置的上下文?假设在onCreate之前调用构造函数。

答案 1 :(得分:1)

onCreate(SQLiteDatabase)方法仅在您第一次调用getReadableDatabase()getWritableDatabase时(即第一次打开时)调用,而不是在应用首次运行时调用(当然,你可以通过简单地打开数据库来关闭它来实现这一点。

我不确定是否可以使用Application上下文,因为progressDialog需要显示在当前运行的Activity中。

不是尝试在首次访问数据库时精确显示进度条,而是在访问数据库本身时,让当前的Activity显示一个。这样,通过定期访问数据库就可以屏蔽对数据库的第一次访问。

如果您不想显示所有数据库访问的进度条,那么您可以再次打开和关闭数据库,并在打开它之前让Activity显示进度条,并在关闭它时删除进度条(除了让onCreate()运行)之外,不对数据库做任何事情。

除非您的数据库结构非常大,否则您甚至可能看不到进度条。创建表格不需要很长时间。

答案 2 :(得分:1)

使用Loader从DB读取数据。不要用UI东西混乱背景类

onCreateLoader(.. 
   //you can start progress

onLoadFinished(..
   // you can stop it

您还可以从后台线程中读取数据。

答案 3 :(得分:0)

您无法访问应用程序的上下文,因为SQLiteOpenHelper没有包含这些方法(与Activity不同)

我的建议是使用DbHelper类来设置数据库并管理任何sql事务。让它的构造函数获取一个上下文对象,然后在扩展Activity的类中创建它的实例,将上下文传递给构造函数。

将活动和sqlliteOpenHelper之间的数据访问对象类放在一起也是一种好习惯,以管理打开,关闭和发布事务数据库对象

答案 4 :(得分:0)

要显示用户进度,您必须在单独的线程中运行您的工作,否则GUI将冻结,直到数据库工作完成并且用户可能得到“活动未响应,强制关闭”消息。

使用Application类存储有关是否已创建数据库的全局标志。

任何启动活动都会检查此标志,如果数据库尚未初始化,则会创建AsyncTask,并在构造函数中传递db及其自己的上下文。 AsyncTask将有三种方法:

  1. onPreExecute:在此处显示您的对话框。使对话框无法取消,因此用户无法跳过它。
  2. doInBackground:数据库构建代码。 (调用数据库助手类方法)
  3. onPostExecute:关闭对话框。现在,用户可以与活动进行交互。