【问题标题】:SQLite data show in ListView in LollipopSQLite 数据显示在 Lollipop 的 ListView 中
【发布时间】:2016-06-30 02:21:35
【问题描述】:

我已经编写了在我的 SQLite 数据库中保存数据的代码,我想在我的 ListView 中显示它。

我的 MainActivity 是

public class MainActivity extends AppCompatActivity{


    //// variable deaclear

    public static final String ROW_ID = "row_id";
    public static final String TITLE = "title";

    private ListView listView;

    private DatabaseConnector databaseConnector;
    private ListView noteListView;
    private CursorAdapter noteAdapter;
    static String[] from = new String[]{TITLE};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
       databaseConnector = new DatabaseConnector(MainActivity.this);
         int[] to = new int[] {R.id.ViewTitleNotes};
        listView = (ListView) findViewById(R.id.listView);

        Cursor cursor = databaseConnector.listAllNotes();

        noteAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.list_note, cursor, from, to);
        listView.setAdapter(noteAdapter);
       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

               Intent intent = new Intent(MainActivity.this, ViewNote.class);

               intent.putExtra(ROW_ID , id);
               startActivity(intent);
           }
       });
    }


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

        new GetNotes().execute(from);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

       switch (id){

           case R.id.add_note:

               Intent intent = new Intent(MainActivity.this , AddEditNote.class);
               startActivity(intent);
               break;

         default:
             break;
       }
        return super.onOptionsItemSelected(item);
    }


    // get note Asyntask

    public class GetNotes extends AsyncTask<Object , Object , Cursor>{
        DatabaseConnector databaseConnector = new DatabaseConnector(MainActivity.this);

        @Override
        protected Cursor doInBackground(Object... params) {



            databaseConnector.open();
            return databaseConnector.listAllNotes();

        }

        @Override
        protected void onPostExecute(Cursor cursor) {
            super.onPostExecute(cursor);
            databaseConnector.close();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        Cursor cursor = noteAdapter.getCursor();
        if (cursor!=null){
            cursor.deactivate();

        }
        noteAdapter.changeCursor(null);

    }
}

我的 DataBaseConnector 类是

public class DatabaseConnector {

    private static final String DB_NAME = "MyNotes";
    public static final String TABLE_NAME = "tablenotes";
    public static final String TITLE = "title";
    public static final String NOTE = "note";
    public static final String ID = "_id";
    public static final int DATABASE_VERSION = 1;

    private SQLiteDatabase database;
    private DatabaseHelper dbOpenHelper;

    public DatabaseConnector(Context context){

       dbOpenHelper = new DatabaseHelper(context , DB_NAME , null ,DATABASE_VERSION);
         }

    public void open(){
        database = dbOpenHelper.getWritableDatabase();

    }

    // databse close

    public void close(){

        if (database!=null){
            database.close();
        }
    }
    // insert data into database

    public void  insertData(String title, String note){

        ContentValues contentValues = new ContentValues();

        contentValues.put(TITLE , title);
        contentValues.put(NOTE , note);

        open();
        database.insert(TABLE_NAME, null, contentValues);
        close();
    }


    public void updateData( long id, String title, String note){

        ContentValues contentValues = new ContentValues();
        contentValues.put(TITLE , title);
        contentValues.put(NOTE, note);

        open();

        database.update(TABLE_NAME, contentValues, ID + "=" + id, null);

        close();
    }

    public void deletData(long id)throws  SQLException{
        open();
        database.delete(TABLE_NAME, ID + "=" + id, null);
        close();
    }


    // get all notes

    public Cursor listAllNotes(){
        return database.query(TABLE_NAME, new String[]{ID , TITLE}, null , null , null , null ,null);

    }


     /// get a single note
    public Cursor getOneNote(long id){
        return database.query(TABLE_NAME, null, ID+"="+id, null, null,null,null);
    }
}

当我运行此代码时,Log cat 显示 MainActivity.java 类中的错误。 在这一行

Cursor cursor = databaseConnector.listAllNotes();

和此方法中的 NullPointerException

public Cursor listAllNotes(){
        return database.query(TABLE_NAME, new String[]{ID , TITLE}, null , null , null , null ,null);
    }

我该如何解决这个问题?

【问题讨论】:

  • 异常名称是什么?
  • @BilalUsean 它显示 java.lang.NullPointerException in. public Cursor listAllNotes(){ return database.query(TABLE_NAME, new String[]{ID , TITLE}, null , null , null , null ,空值); } 这个方法。
  • @BilalUsean 我已经编辑了我的问题,请阅读。谢谢

标签: java android sqlite listview nullpointerexception


【解决方案1】:

您永远不会在listAllNotes() 内部调用open(),因此database 在该行中为空

return database.query(TABLE_NAME, new String[]{ID , TITLE}, null , null , null , null ,null);

【讨论】:

  • 这听起来是一个新问题,您可以发布另一个问题,但我会提示您 onResume 中的 AsyncTask 对 ListView 没有任何作用,而 onStop 是做noteAdapter.changeCursor(null);,这会导致你的数据消失。不过,由于我已经解决了您这次提出的问题,您可以使用答案旁边的复选标记接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多