我有一个数据库,我创建了一个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();
。
答案 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
将有三种方法: