2015-12-23 2 views
2

я пытаюсь получить данные из базы данных SQLite и загрузить его в виде списка, но я получаю эту ошибкупытается загрузить данные из базы данных, чтобы ListView в Android

12-23 02:04:01.751 3296-3296/com.chaos.todolist E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.chaos.todolist, PID: 3296 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chaos.todolist/com.chaos.todolist.show}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) 
at android.app.ActivityThread.access$900(ActivityThread.java:177) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5942) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference 
at com.chaos.todolist.DataBase.getTasks(DataBase.java:28) 
at com.chaos.todolist.show.LoadDataFromDataBaseToListView(show.java:30) 
at com.chaos.todolist.show.onCreate(show.java:25) 
at android.app.Activity.performCreate(Activity.java:6289) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)  
at android.app.ActivityThread.access$900(ActivityThread.java:177)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:145)  
at android.app.ActivityThread.main(ActivityThread.java:5942)  
at java.lang.reflect.Method.invoke(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:372)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)at com.android.in ternal.os.ZygoteInit.main(ZygoteInit.java:1195) 

это функция класса базы данных и я есть еще один, который является помощником ..

package com.chaos.todolist; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 

public class DataBase { 

    private SQLiteDatabase mDatabase; 
    private DB_Helper TODOHelper; 

    public DataBase(Context context) { 
     TODOHelper = new DB_Helper(context); 
    } 

    public void open() { 
     mDatabase = TODOHelper.getWritableDatabase(); 
    } 

    public void close() { 
     if (mDatabase != null) { 
      mDatabase.close(); 
     } 
    } 
    public Cursor getTasks() { 
     String[] col = {TODOHelper.COLUMN_ID, TODOHelper.COLUMN_NAME }; 
     Cursor cursor = mDatabase.query(
       TODOHelper.TABLE_TASKS, // table name 
       col , // column names 
       null, // where clause 
       null, // where params 
       null, // groupby 
       null, // having 
       TODOHelper.COLUMN_NAME // orderby 
     ); 
     return cursor; 
    } 

    public Cursor getTasksById(int id) { 
     String[] columns = {TODOHelper.COLUMN_NAME, TODOHelper.COLUMN_DATE, 
       TODOHelper.COLUMN_ADDRESS}; 

     return mDatabase.query(
       DB_Helper.TABLE_TASKS, // table name 
       columns, // column names 
       DB_Helper.COLUMN_ID + " = " + id, // where clause // id param. could be here or appended as it is^
       null, // where params 
       null, // groupby 
       null, // having 
       null // orderby 
     ); 
    } 

    public void deleteTaskById(int id) { 
     open(); 
     mDatabase.delete(
       DB_Helper.TABLE_TASKS, // table name 
       DB_Helper.COLUMN_ID +"="+ id, // where clause 
       null // where params 
     ); 
     close(); 
    } 

    public void insertTask(String name, String date, String address) { 
     mDatabase.beginTransaction(); 
     try { 
      ContentValues newTask = new ContentValues(); 
      newTask.put(DB_Helper.COLUMN_NAME, name); 
      newTask.put(DB_Helper.COLUMN_DATE, date); 
      newTask.put(DB_Helper.COLUMN_ADDRESS, address); 
      mDatabase.insert(DB_Helper.TABLE_TASKS, null, newTask); 
      mDatabase.setTransactionSuccessful(); 
     } 
     finally { 
      mDatabase.endTransaction(); 
     } 
    } 

    public void updateTask(int rowId, String name, String date, String address) { 
     ContentValues editTask = new ContentValues(); 
     editTask.put(DB_Helper.COLUMN_NAME, name); 
     editTask.put(DB_Helper.COLUMN_DATE, date); 
     editTask.put(DB_Helper.COLUMN_ADDRESS, address); 

     mDatabase.update(
       DB_Helper.TABLE_TASKS, // table name 
       editTask, // values 
       DB_Helper.COLUMN_ID + " = " + rowId, // where clause 
       null // where params 
     ); 

    } 
} 

и это класс, который я должен использовать функцию, которая загружает данные show.java

package com.chaos.todolist; 

import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class show extends AppCompatActivity { 
    ListView listView; 
    DataBase db; 
    TextView empty; 
    Cursor result; 
    ArrayAdapter adapter; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.show); 
     listView=(ListView) findViewById(R.id.listView1); 
     db=new DataBase(show.this); 
     empty = (TextView) findViewById(android.R.id.empty); 
     Log.d("show", "is going to load database"); 
     LoadDataFromDataBaseToListView(); 
     listView.setEmptyView(empty); 
    } 

    public void LoadDataFromDataBaseToListView() { 
     result=db.getTasks(); 
     Log.d("show","it got tasks"); 
     if (result != null && result.getCount() > 0) { 
      Log.d("load data", "Load Data From DataBase To ListView has started"); 
      db.open(); 
      int i = 0; 
      String[] names = new String[result.getCount()]; 
      int[] ids = new int[result.getCount()]; 
      try { 
       Log.d("load data","in thr try"); 
       if (result.moveToFirst()) { 
        int index_id = result.getColumnIndex(DB_Helper.COLUMN_ID); 
        int index_name = result.getColumnIndex(DB_Helper.COLUMN_NAME); 
        Log.d("load data", "got the index"); 
        do { 
         ids[i] = result.getInt(index_id); 
         String ss = result.getString(index_name); 
         names[i] = ss; 
         ++i; 
        } while (result.moveToNext()); 

        db.close(); 
        Log.d("load data", "clossed connection to database"); 
        adapter = new ArrayAdapter<String>(
          getApplicationContext(), 
          R.layout.taskitem,R.id.Task_name, 
          names); 
        listView.setAdapter(adapter); 
        Log.d("load data", "try finished"); 
       } 
      } catch (Exception e) { 
       Log.d("load data", "in catch"); 
       Toast.makeText(getApplicationContext(), e.getMessage(), 
         Toast.LENGTH_LONG).show(); 
      } 
      Log.d("load data", "finished if"); 
     } else { 
      Log.d("load data", "in else"); 
      Toast.makeText(this, "is null", Toast.LENGTH_LONG).show(); 
     } 
    } 

    protected void onResume() { 
     super.onResume(); 

    } 
    protected void onPause() 
    { 
     super.onPause(); 
    } 
} 

ответ

3

Чтобы добавить к выше плакату, если вы беспокоитесь о защите вы можете захотеть сделать открытый метод частным или защищенным:

protected void open() 
{ 
    mDatabase = TODOHelper.getWritableDatabase(); 
} 

, а затем изменить конструктор:

public DataBase(Context context) { 
    TODOHelper = new DB_Helper(context); 
    open(); 
} 

Это может сэкономить немного усилий по дороге.

1

Вам необходимо открыть свою базу данных, прежде чем вы сможете запросить ее. Это ваш обновленный onCreate:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.show); 
    listView=(ListView) findViewById(R.id.listView1); 
    db=new DataBase(show.this); 
    db.open(); 
    empty = (TextView) findViewById(android.R.id.empty); 
    Log.d("show", "is going to load database"); 
    LoadDataFromDataBaseToListView(); 
    listView.setEmptyView(empty); 
} 

Если вы не открыть его перед вызовом метода getTasks этот метод пытается вызвать mDatabase.query, который до сих пор null.

Смежные вопросы