2016-11-10 4 views
-2

Ich weiß, dass diese Frage tausend Mal gefragt wurde und ich lese viele von ihnen und die Antworten. Aber ich konnte mein Problem in diesem Fall nicht beheben. Wenn ich die getWritableDatabase() Funktion in meiner android app Aufruf erhalte ich diese Ausnahme:Android NullPointException auf getWritableDatabase

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: de.schneider_schwarz_inc.tagesablauf_log, PID: 12634 
       java.lang.RuntimeException: Unable to start activity ComponentInfo{de.schneider_schwarz_inc.tagesablauf_log/de.schneider_schwarz_inc.tagesablauf_log.GUI.ToDo.ToDoList}: java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
       Caused by: java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference 
        at de.schneider_schwarz_inc.tagesablauf_log.Database.ToDo.ToDoDao.insertToDo(ToDoDao.java:41) 
        at de.schneider_schwarz_inc.tagesablauf_log.Todo.createTodo(Todo.java:25) 
        at de.schneider_schwarz_inc.tagesablauf_log.GUI.ToDo.ToDoList.onCreate(ToDoList.java:47) 
        at android.app.Activity.performCreate(Activity.java:6664) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
        at android.app.ActivityThread.-wrap12(ActivityThread.java)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:154)  
        at android.app.ActivityThread.main(ActivityThread.java:6077)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  
       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference 
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) 
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
        at de.schneider_schwarz_inc.tagesablauf_log.Database.ToDo.ToDoDao.insertToDo(ToDoDao.java:32) 
        at de.schneider_schwarz_inc.tagesablauf_log.Todo.createTodo(Todo.java:25)  
        at de.schneider_schwarz_inc.tagesablauf_log.GUI.ToDo.ToDoList.onCreate(ToDoList.java:47)  
        at android.app.Activity.performCreate(Activity.java:6664)  
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)  
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)  
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
        at android.app.ActivityThread.-wrap12(ActivityThread.java)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        at android.os.Looper.loop(Looper.java:154)  
        at android.app.ActivityThread.main(ActivityThread.java:6077)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  

Meine Sqliteopenhelper Klasse:

public ToDoDbHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

public void onCreate(SQLiteDatabase db) { 
    System.out.println("creating database"); 
    db.execSQL(SQL_CREATE_ENTRIES); 
} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL(SQL_DELETE_ENTRIES); 
    onCreate(db); 
} 

public static int getDatabaseVersion() { 
    return DATABASE_VERSION; 
} 

ich es in dieser Klasse verwenden:

public class ToDoDao { 
    private Context context; 
    private ToDoDbHelper toDoDbHelper; 

    public ToDoDao(Context context){ 
     this.context = context; 
     toDoDbHelper = new ToDoDbHelper(context); 
    } 


/** 
* Inserts ToDos into Database 
* @param data data to insert 
* @return is -1 when error, else the id 
*/ 
public long insertToDo(ToDoData data){ 
    try{ 
     SQLiteDatabase db = toDoDbHelper.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(ToDoStructure.ToDoEntry.COLUMN_NAME_TITLE, data.getTitle()); 
     values.put(ToDoStructure.ToDoEntry.COLUMN_NAME_DATE, data.getDate()); 

     return db.insert(ToDoStructure.ToDoEntry.TABLE_NAME, null, values); 
    }catch (Exception e){ 
     System.out.println("ERROR!"); 
     //TODO handling exception 
     throw new RuntimeException(e); 
    } 
} 

Das Dao verwende ich hier:

public class Todo { 
private List<ToDoData> dataList; 
private Context context; 
private ToDoDao dao = new ToDoDao(context); 

public Todo(Context context){ 
    this.context = context; 
    //dataList = dao.getAllToDos(); 
    dataList = new ArrayList<>(); 
} 

public int createTodo(String title, String date){ 
    ToDoData newData = new ToDoData(title, date); 
    long id = dao.insertToDo(newData); 
    if(id == -1){ 
     return (int) id; 
    } 
    newData.setId(String.valueOf(id)); 
    dataList.add(newData); 
    return 0; 
} 

Und zumindest meine Tätigkeit, wo ich meinen Kontext erhalten:

public class ToDoList extends Activity { 
private RecyclerView mRecyclerView; 
private RecyclerView.Adapter mAdapter; 
private RecyclerView.LayoutManager mLayoutManager; 

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    System.out.println("createListView"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_todo); 

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    mRecyclerView.setHasFixedSize(true); 

    mLayoutManager = new LinearLayoutManager(this); 
    mRecyclerView.setLayoutManager(mLayoutManager); 


    Todo todo = new Todo(this); 
    todo.createTodo("Test1", "20160910"); 
    List<ToDoData> todoList = todo.getDataList(); 
    System.out.println(todoList.get(0).getTitle()); 

    mAdapter = new ToDoViewAdapter(getBaseContext(), todoList); 
    mRecyclerView.setAdapter(mAdapter); 


} 

Ich denke, das Problem mein Kontext ist. Aber ich weiß nicht, es zu reparieren ...

Danke!

Antwort

0

Ok ... Ich habe das Problem.

private Context context; 
private ToDoDao dao = new ToDoDao(context); 

public Todo(Context context){ 
    this.context = context; 
    //dataList = dao.getAllToDos(); 
    dataList = new ArrayList<>(); 
} 

Der Kontext ist null, wenn ich es mit dem dao passieren. Stattdessen habe ich das jetzt getan:

private Context context; 
    private ToDoDao dao; 

    public Todo(Context context){ 
     this.context = context; 
     dao = new ToDoDao(context); 
     //dataList = dao.getAllToDos(); 
     dataList = new ArrayList<>(); 
    } 

Eine solche Schuld ...

Verwandte Themen