Sqlite Android中存在数据库问题的应用类
我在Android应用程序中访问SQLite数据库时遇到问题。我创建了一个包含SQLiteOpenHelper实例的应用程序类,但是每当我试图在另一个活动中打开DB时,它就会崩溃 这是我的应用程序类:Sqlite Android中存在数据库问题的应用类,sqlite,class,sqliteopenhelper,android,Sqlite,Class,Sqliteopenhelper,Android,我在Android应用程序中访问SQLite数据库时遇到问题。我创建了一个包含SQLiteOpenHelper实例的应用程序类,但是每当我试图在另一个活动中打开DB时,它就会崩溃 这是我的应用程序类: public class GlobalVariables extends Application { private LocationsData locations; public void onCreate(Context context) { loc
public class GlobalVariables extends Application {
private LocationsData locations;
public void onCreate(Context context) {
locations = new LocationsData(context);
}
public LocationsData getLocations() {
return locations;
}
}
以下是我的SQLiteOpenHelper类:
public class LocationsData extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "locations.db";
private static final int DATABASE_VERSION = 1;
public static final String TABLE_LOCATIONS = "locations";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NICKNAME = "nickname";
private static final String DATABASE_CREATE = "create table "
+ TABLE_LOCATIONS + "( " + COLUMN_ID
+ " integer primary key autoincrement, " + COLUMN_NICKNAME
+ " text not null);";
public LocationsData(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOCATIONS);
onCreate(db);
}
}
当我尝试在另一个类似这样的活动中访问数据库时,我会得到一个错误:
@Override
public void onResume()
{
locationsData=((GlobalVariables)getApplication()).getLocations();
SQLiteDatabase db = locationsData.getReadableDatabase();
super.onResume();
}
有什么帮助吗?谢谢大家!
Log Cat:
05-10 02:00:50.146: D/AndroidRuntime(532): Shutting down VM
05-10 02:00:50.146: W/dalvikvm(532): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-10 02:00:50.179: E/AndroidRuntime(532): FATAL EXCEPTION: main
05-10 02:00:50.179: E/AndroidRuntime(532): java.lang.RuntimeException: Unable to resume activity {com.John.seniorDesign/com.John.seniorDesign.LocationsTabActivity}: java.lang.NullPointerException
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:138)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabHost.setCurrentTab(TabHost.java:326)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.view.View.performClick(View.java:2485)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.view.View$PerformClick.run(View.java:9080)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.os.Handler.handleCallback(Handler.java:587)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.os.Handler.dispatchMessage(Handler.java:92)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.os.Looper.loop(Looper.java:130)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.ActivityThread.main(ActivityThread.java:3683)
05-10 02:00:50.179: E/AndroidRuntime(532): at java.lang.reflect.Method.invokeNative(Native Method)
05-10 02:00:50.179: E/AndroidRuntime(532): at java.lang.reflect.Method.invoke(Method.java:507)
05-10 02:00:50.179: E/AndroidRuntime(532): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-10 02:00:50.179: E/AndroidRuntime(532): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-10 02:00:50.179: E/AndroidRuntime(532): at dalvik.system.NativeStart.main(Native Method)
05-10 02:00:50.179: E/AndroidRuntime(532): Caused by: java.lang.NullPointerException
05-10 02:00:50.179: E/AndroidRuntime(532): at com.John.seniorDesign.LocationsTabActivity.onResume(LocationsTabActivity.java:75)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.Activity.performResume(Activity.java:3832)
05-10 02:00:50.179: E/AndroidRuntime(532): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
05-10 02:00:50.179: E/AndroidRuntime(532): ... 17 more
在GlobalVariables中,将新位置数据中的上下文更改为getApplicationContext(),并从onCreate中删除上下文-此签名不存在 编辑:
public class GlobalVariables extends Application {
private LocationsData locations;
@Override
public void onCreate() {
locations = new LocationsData(getApplicationContext());
}
public LocationsData getLocations() {
return locations;
}
}
不确定原因是什么,但以下是我通常如何实现db打开/关闭功能: 在我的db类中:
public GroceryDB(Context ctx) {
this.mCtx = ctx;
}
public GroceryDB open() throws SQLException {
mDBHelper = new DBHelper(mCtx);
mDb = mDBHelper.getWritableDatabase();
return this;
}
public void close() {
mDBHelper.close();
}
然后我在任何其他类中这样称呼它:
mDbHelper = new GroceryDB(getActivity());
mDbHelper.open();
希望这有帮助 在应用程序的生命周期中,您始终希望确保处理的是单个数据库实例。看看这个,你会发现一个类似的问题。它给出了几个示例,说明如何在应用程序中正确打开/关闭数据库。从logcat发布错误的堆栈跟踪。我认为这可能与GlobalVariables类中onCreate()调用中的上下文不正确有关。但是我不确定…发布LocationsTabActivity.onResume的代码我写的最后一部分是什么,我会编辑它,尽管它的第75行是空的,因为:java.lang.NullPointerException 05-10 02:00:50.179:E/AndroidRuntime(532):在com.John.seniorDesign.LocationsTabActivity.onResume(LocationsTabActivity.java:75)@我会抓住这一点的。当然,我把它加入了我的答案中。谢谢