0

タイトルにあるように、データベースからリストを取得しようとすると 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 万行以上あることに注意してください。必要に応じて大幅に減らします。:)

4

2 に答える 2

1

呼び出す前にSqliteHelperクラスオブジェクトを作成していないようです。getAllRockBands() 一度確認するか、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));
    }
}

BandDatabaseAdapterを宣言したが、そのインスタンスを作成しなかったため、NullPointerExceptionが発生しました。インスタンスを作成してから呼び出す必要があります。上記のコードでは、最初にオブジェクトを作成してから呼び出しました。お役に立てば幸いです。

于 2012-12-27T15:10:56.683 に答える
0

"selection" argument definition :

A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table.

Before doing :

int index = cursor.getColumnIndex(BAND_NAME);

you should check if cursor is null. Same thing for :

if (cursor.moveToFirst())
于 2012-12-27T15:15:19.260 に答える