调用数据库时出现NullPointerException

时间:2012-12-27 15:07:12

标签: android database sqlite list nullpointerexception

正如标题所示,当我尝试从数据库中获取列表时,我收到NullPointerException。这是代码:

public List<String> getAllRockBands() {
     List<String> bandList = new ArrayList<String>();

     String selection = BAND_GENRE + "=1";

     SQLiteDatabase db = sqLiteHelper.getReadableDatabase();
     Cursor cursor = db.query(BANDDATABASE_TABLE,new String[]{BAND_NAME}, selection, null, null, null, BAND_NAME);

     int index = cursor.getColumnIndex(BAND_NAME);

     if (cursor.moveToFirst()) {
         do {
          String bandName = cursor.getString(index);
             bandList.add(bandName);
         } while (cursor.moveToNext());
     }

     return bandList;
 }

`

public class RockAllFragment extends SherlockListFragment {

    private BandDatabaseAdapter mySQLiteAdapter;
    private List<String> bandList = mySQLiteAdapter.getAllRockBands();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    return inflater.inflate(R.layout.my_list, null);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);

    setListAdapter(new ArrayAdapter<String>(getSherlockActivity(), android.R.layout.simple_list_item_multiple_choice, android.R.id.text1, bandList));
    }
}

我仍然在学习这个环境中的代码,所以我猜这只是一些初学者的错误?

编辑:(这有点多,但你问过)

public class BandDatabaseAdapter {

 private static final String TAG = "BandDatabase";

 private static final String BANDDATABASE_NAME = "BAND_DATABASE";
 private static final String BANDDATABASE_TABLE = "BAND_TABLE";
 private static final int BANDDATABASE_VERSION = 1;
 public static final String BAND_NAME = "name";
 public static final String BAND_GENRE = "genre";
 public static final String BAND_POPULAR = "popular";
 public static final String BAND_SELECTED = "selected";

 private static final String BANDDATABASE_CREATE="CREATE TABLE IF NOT EXISTS " + BANDDATABASE_TABLE
 + " (_id integer primary key autoincrement, " + BAND_NAME
 + " TEXT NOT NULL, " + BAND_GENRE + " TEXT NOT NULL, " + BAND_POPULAR
 + " TEXT NOT NULL, " + BAND_SELECTED + " TEXT NOT NULL)";

 private SQLiteHelper sqLiteHelper;
 private SQLiteDatabase sqLiteDatabase;
 private final Context context;

 public BandDatabaseAdapter(Context c) {
       sqLiteHelper = new SQLiteHelper(c, BANDDATABASE_NAME, null, BANDDATABASE_VERSION);
       context = c;
    }

 public BandDatabaseAdapter openToRead() throws android.database.SQLException {
  sqLiteDatabase = sqLiteHelper.getReadableDatabase();
  return this; 
 }

 public BandDatabaseAdapter openToWrite() throws android.database.SQLException {
  sqLiteDatabase = sqLiteHelper.getWritableDatabase();
  return this; 
 }

 public void close(){
  sqLiteHelper.close();
 }

 public void updateBand(String name, String selected) {
     ContentValues contentValues = new ContentValues();
     contentValues.put(BAND_SELECTED, selected);
     sqLiteDatabase.update(BANDDATABASE_TABLE, contentValues, "BAND_NAME=" + name, null);
     close();
 }

 public List<String> getAllRockBands() {
     List<String> bandList = new ArrayList<String>();

     String selection = BAND_GENRE + "=1";

     SQLiteDatabase db = sqLiteHelper.getReadableDatabase();
     Cursor cursor = db.query(BANDDATABASE_TABLE,new String[]{BAND_NAME}, selection, null, null, null, BAND_NAME);

     if(cursor!=null)
     {
     int index = cursor.getColumnIndex(BAND_NAME);

     if (cursor.moveToFirst()) {
         do {
          String bandName = cursor.getString(index);
             bandList.add(bandName);
         } while (cursor.moveToNext());
     }
     }
     return bandList;
 }

 public List<String> getMyList() {
     List<String> myList = new ArrayList<String>();

     String selection = BAND_SELECTED + "=1";

     SQLiteDatabase db = sqLiteHelper.getReadableDatabase();
     Cursor cursor = db.query(BANDDATABASE_TABLE,new String[]{BAND_NAME}, selection, null, null, null, BAND_NAME);

     int index = cursor.getColumnIndex(BAND_NAME);

     if (cursor.moveToFirst()) {
         do {
          String bandName = cursor.getString(index);
             myList.add(bandName);
         } while (cursor.moveToNext());
     }

     return myList;
 }

 public class SQLiteHelper extends SQLiteOpenHelper {

  public SQLiteHelper(Context context, String name,
    CursorFactory factory, int version) {
   super(context, name, factory, version);
  }

  private boolean doesDatabaseExist(Context context, String dbName) {
        File dbFile=context.getDatabasePath(dbName);
        return dbFile.exists();
    }

  @Override
  public void onCreate(SQLiteDatabase db) {
   // TODO Auto-generated method stub
   if(!(doesDatabaseExist(context,BANDDATABASE_NAME)))
   {
      db.execSQL(BANDDATABASE_CREATE);
      loadDatabase();
   }
  }

  /**
   * Starts a thread to load the database table with bands
   */
  private void loadDatabase() {
      new Thread(new Runnable() {
          public void run() {
              try {
                  loadBands();
              } catch (IOException e) {
                  throw new RuntimeException(e);
              }
          }
      }).start();
  }

  //loads a database from a txt file
  private void loadBands() throws IOException {
      Log.d(TAG, "Loading bands...");
      final Resources resources = context.getResources();
      InputStream inputStream = resources.openRawResource(R.raw.bands);
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

      try {
          String line;
          while ((line = reader.readLine()) != null) {
              String[] strings = TextUtils.split(line, "^");
              if (strings.length < 4) continue;
              long id = addBand(strings[0].trim(), strings[1].trim(), strings[2].trim());
              if (id < 0) {
                  Log.e(TAG, "unable to add band: " + strings[0].trim());
              }
          }
      } finally {
          reader.close();
      }
      Log.d(TAG, "DONE loading words.");
  }

  public long addBand(String name, String genre, String popular) {
      ContentValues initialValues = new ContentValues();
      initialValues.put(BAND_NAME, name);
      initialValues.put(BAND_GENRE, genre);
      initialValues.put(BAND_POPULAR, popular);
      initialValues.put(BAND_SELECTED, "0");

      return sqLiteDatabase.insert(BANDDATABASE_TABLE, null, initialValues);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
    // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + BANDDATABASE_TABLE);

        // Create tables again
        onCreate(db);
  }

 }

}

其他信息:有人告诉我使用SimpleCursorAdapter,但它说它已被弃用。另外,请注意我的列表有超过15万行,如果需要,我会大大减少。 :)

2 个答案:

答案 0 :(得分:1)

看起来您在调用getAllRockBands()之前没有创建SqliteHelper类对象请检查一次或者发布您的SqliteHelper类构造函数代码

在此处更改您的代码,请检查它。

public class RockAllFragment extends SherlockListFragment {

    private BandDatabaseAdapter mySQLiteAdapter;
    private List<String> bandList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    return inflater.inflate(R.layout.my_list, null);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);
    mySQLiteAdapter= new BandDatabaseAdapter(getSherlockActivity());
    bandList  = mySQLiteAdapter.getAllRockBands();

    setListAdapter(new ArrayAdapter<String>(getSherlockActivity(), android.R.layout.simple_list_item_multiple_choice, android.R.id.text1, bandList));
    }
}

你得到了NullPointerException,因为你已经声明了BandDatabaseAdapter但没有创建它的实例。你需要创建它的实例,然后调用它。在上面的代码中,我先创建了对象然后调用。希望它可以帮到你。

答案 1 :(得分:0)

“选择”参数定义:

  

过滤器,声明要返回哪些行,格式化为SQL WHERE子句(不包括WHERE本身)。传递null将返回给定表的所有行。

在做之前:

int index = cursor.getColumnIndex(BAND_NAME);

你应该检查游标是否为空。同样的事情:

if (cursor.moveToFirst())