正如标题所示,当我尝试从数据库中获取列表时,我收到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万行,如果需要,我会大大减少。 :)
答案 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())