我有一个带有SQLiteOpenHelper实例的单例类。
public class AppManager { //Singleton
private static AppManager _instance = null;
private static DataSource datasource;
....
public static AppManager getInstance() {
if (_instance == null) {
_instance = new AppManager();
}
return _instance;
}
private AppManager() {
datasource = new DataSource(App.get());
}
....
}
获取上下文我创建了一个名为App.java的文件:
import android.app.Application;
public class App extends Application {
private static App instance;
public static App get() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
DataSource文件如下所示:
public class DataSource {
private SQLiteDatabase database;
private MySQLiteHelper dbHelper;
public DataSource(Context context) {
dbHelper = new MySQLiteHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public Line createLine(int ID) {
ContentValues values = new ContentValues();
values.put("ID", ID);
database.insertWithOnConflict("LINES", null, values, SQLiteDatabase.CONFLICT_IGNORE);
Cursor cursor = database.query("LINES", columns_LINES, "ID = " + ID, null, null, null, null);
cursor.moveToFirst();
return cursorToLine(cursor);
}
}
现在我的问题是,当我调用AppManager.getInstance().getDB().createLine(1);
时,我得到一个NullPointerException。我想这是因为我在Singleton类中声明了DataSource。我不想将DataSource设置为Singleton类,但是有另一种方法可以获得DataSource类的实例吗?
logcat说:
09-16 00:18:25.604: E/AndroidRuntime(11858): FATAL EXCEPTION: main
09-16 00:18:25.604: E/AndroidRuntime(11858): java.lang.NullPointerException
09-16 00:18:25.604: E/AndroidRuntime(11858): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
09-16 00:18:25.604: E/AndroidRuntime(11858): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
09-16 00:18:25.604: E/AndroidRuntime(11858): at com.testapp.android.DataSource.open(DataSource.java:26)
09-16 00:18:25.604: E/AndroidRuntime(11858): at com.testapp.android.AppManager.<init>(AppManager.java:28)
09-16 00:18:25.604: E/AndroidRuntime(11858): at com.testapp.android.AppManager.getInstance(AppManager.java:21)
09-16 00:18:25.604: E/AndroidRuntime(11858): at com.testapp.android.SplashScreen$1.run(SplashScreen.java:76)
09-16 00:18:25.604: E/AndroidRuntime(11858): at android.os.Handler.handleCallback(Handler.java:615)
09-16 00:18:25.604: E/AndroidRuntime(11858): at android.os.Handler.dispatchMessage(Handler.java:92)
09-16 00:18:25.604: E/AndroidRuntime(11858): at android.os.Looper.loop(Looper.java:137)
09-16 00:18:25.604: E/AndroidRuntime(11858): at android.app.ActivityThread.main(ActivityThread.java:4856)
09-16 00:18:25.604: E/AndroidRuntime(11858): at java.lang.reflect.Method.invokeNative(Native Method)
09-16 00:18:25.604: E/AndroidRuntime(11858): at java.lang.reflect.Method.invoke(Method.java:511)
09-16 00:18:25.604: E/AndroidRuntime(11858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
09-16 00:18:25.604: E/AndroidRuntime(11858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
09-16 00:18:25.604: E/AndroidRuntime(11858): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
您需要在方法open()
的开头调用createLine(int)
。您的database
仍为空。