在Singleton类中有一个SQLiteOpenHelper实例

时间:2014-09-15 18:58:19

标签: android

我有一个带有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)

1 个答案:

答案 0 :(得分:0)

您需要在方法open()的开头调用createLine(int)。您的database仍为空。