我正在尝试从数据库中获取数据并将其放在 android 中的 ListView 中
I am trying to fetch data from database and place it in a ListView in android
我想创建一个包含 1 个问题和 4 个选项的测验应用程序,为此我创建了一个数据库,使用 ListView
从中将问题和选项提取到 5 个文本视图。我浏览了很多教程并使用 Whosebug 中的一个页面使用 ArrayList
和 Cursor
创建了它,但我得到了
错误。
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.example.shark.shopapp.merge.getData(merge.java:26)
at com.example.shark.shopapp.MainActivity.onCreate(MainActivity.java:68)
它显示在 Cursor.query() 行中。主要活动:
setContentView(R.layout.ques_layout); db=openOrCreateDatabase("check1.db",SQLiteDatabase.CREATE_IF_NECESSARY,null);
db.execSQL("CREATE TABLE que(ques TEXT,optn1 TEXT,optn2 TEXT,optn3 TEXT,optn4 TEXT)");
ListView l1=(ListView)findViewById(R.id.listView2);
merge mer=new merge(this);
ArrayList<String> data=mer.getData();
l1.setAdapter(new ArrayAdapter<String>(this,R.layout.ques_layout,data));
db.close();
Merge.java:
public merge(Context c){ourContext=c;}
public ArrayList<String> getData() {
String[] columns = new String[]{ques, optn1, optn2, optn3, optn4};
Cursor c2=db.query(DATABASE_TABLE,columns,null,null,null,null,null);
ArrayList<String> result = new ArrayList<String>();
int ques = c2.getColumnIndex("_id");
int optn1 = c2.getColumnIndex("optn1");
int optn2 = c2.getColumnIndex("optn2");
int optn3 = c2.getColumnIndex("optn3");
int optn4 = c2.getColumnIndex("optn4");
for (c2.moveToFirst(); !c2.isAfterLast(); c2.moveToNext()) {
result.add(c2.getString(ques) + c2.getString(optn1) + c2.getString(optn2) + c2.getString(optn3) + c2.getString(optn4));
}
db.close();
return result;
}
}
试试这个:
String strQuery="select option from (select option1 as option from table
联合所有
select option2 作为来自 table
的选项
联合所有
select option3 作为来自 table
的选项
联合所有
select option4 作为来自 table) 的选项作为结果";
游标 c2 = db.SelectQuery(strQuery);
String[] from ={"option"};//想加多少就加多少。
in[] to to = {"R.id.TextViewID"};//你可以根据需要添加任意多个。
SimpleCursorAdapter sca = new SimpleCursorAdapter(youractivityname.this,R.layout.listviewlayout,c2,from,to);
yourlistview.setAdapter(sca);
你可以这样做。
_cursor = _database.rawQuery("select * from "+YOUR_TABLE_NAME, null);
_cursor.moveToFirst();
while(_cursor.isAfterLast() == false){
_idDB = _cursor.getInt(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_ID));
_ivrsDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_IVRS_NUM));
_readingDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_METER_READING));
_imageDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_IMAGE));
_userIdDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_USER_ID));
_latDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_LAT));
_longDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_LONG));
_dateDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_DATE_TIME));
_mob1DB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_MOB_FIRST));
_mob2DB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_MOB_SECOND));
_reasonSelected = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_REASON));
//need to call UPDATE WS
updateDataFromDB(context, _idDB , _ivrsDB , _readingDB, _imageDB, _userIdDB , _latDB , _longDB, _dateDB , _mob1DB , _mob2DB
,_reasonSelected);
System.out.println("Id from DB=" + _idDB);
System.out.println("IVRS NUMBER="+ _ivrsDB);
System.out.println("Reading="+ _readingDB);
//System.out.println("Image Path="+_cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_IMAGE)));
System.out.println("USer ID="+_userIdDB);
System.out.println("LAT="+_latDB);
System.out.println("LONG="+_longDB);
System.out.println("DATE="+ _dateDB);
System.out.println("MOb 1="+_mob1DB);
System.out.println("Mob 2="+_mob2DB);
System.out.println("Reason from db =" + _reasonSelected);
_cursor.moveToNext();
}
_cursor.close();
您的 db
变量未在 merge
中初始化。
假设您使用的是 SQLiteOpenHelper
,例如getWritableDatabase()
在辅助对象上获取一个 SQLiteDatabase
对象,您可以将其分配给 db
.
我想创建一个包含 1 个问题和 4 个选项的测验应用程序,为此我创建了一个数据库,使用 ListView
从中将问题和选项提取到 5 个文本视图。我浏览了很多教程并使用 Whosebug 中的一个页面使用 ArrayList
和 Cursor
创建了它,但我得到了
错误。
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.example.shark.shopapp.merge.getData(merge.java:26)
at com.example.shark.shopapp.MainActivity.onCreate(MainActivity.java:68)
它显示在 Cursor.query() 行中。主要活动:
setContentView(R.layout.ques_layout); db=openOrCreateDatabase("check1.db",SQLiteDatabase.CREATE_IF_NECESSARY,null);
db.execSQL("CREATE TABLE que(ques TEXT,optn1 TEXT,optn2 TEXT,optn3 TEXT,optn4 TEXT)");
ListView l1=(ListView)findViewById(R.id.listView2);
merge mer=new merge(this);
ArrayList<String> data=mer.getData();
l1.setAdapter(new ArrayAdapter<String>(this,R.layout.ques_layout,data));
db.close();
Merge.java:
public merge(Context c){ourContext=c;}
public ArrayList<String> getData() {
String[] columns = new String[]{ques, optn1, optn2, optn3, optn4};
Cursor c2=db.query(DATABASE_TABLE,columns,null,null,null,null,null);
ArrayList<String> result = new ArrayList<String>();
int ques = c2.getColumnIndex("_id");
int optn1 = c2.getColumnIndex("optn1");
int optn2 = c2.getColumnIndex("optn2");
int optn3 = c2.getColumnIndex("optn3");
int optn4 = c2.getColumnIndex("optn4");
for (c2.moveToFirst(); !c2.isAfterLast(); c2.moveToNext()) {
result.add(c2.getString(ques) + c2.getString(optn1) + c2.getString(optn2) + c2.getString(optn3) + c2.getString(optn4));
}
db.close();
return result;
}
}
试试这个:
String strQuery="select option from (select option1 as option from table
联合所有
select option2 作为来自 table
的选项
联合所有
select option3 作为来自 table
的选项
联合所有
select option4 作为来自 table) 的选项作为结果";
游标 c2 = db.SelectQuery(strQuery);
String[] from ={"option"};//想加多少就加多少。
in[] to to = {"R.id.TextViewID"};//你可以根据需要添加任意多个。
SimpleCursorAdapter sca = new SimpleCursorAdapter(youractivityname.this,R.layout.listviewlayout,c2,from,to);
yourlistview.setAdapter(sca);
你可以这样做。
_cursor = _database.rawQuery("select * from "+YOUR_TABLE_NAME, null);
_cursor.moveToFirst();
while(_cursor.isAfterLast() == false){
_idDB = _cursor.getInt(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_ID));
_ivrsDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_IVRS_NUM));
_readingDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_METER_READING));
_imageDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_IMAGE));
_userIdDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_USER_ID));
_latDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_LAT));
_longDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_LONG));
_dateDB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_DATE_TIME));
_mob1DB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_MOB_FIRST));
_mob2DB = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_MOB_SECOND));
_reasonSelected = _cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_REASON));
//need to call UPDATE WS
updateDataFromDB(context, _idDB , _ivrsDB , _readingDB, _imageDB, _userIdDB , _latDB , _longDB, _dateDB , _mob1DB , _mob2DB
,_reasonSelected);
System.out.println("Id from DB=" + _idDB);
System.out.println("IVRS NUMBER="+ _ivrsDB);
System.out.println("Reading="+ _readingDB);
//System.out.println("Image Path="+_cursor.getString(_cursor.getColumnIndex(MySqliteHelper.READING_DETAILS_COLUMN_IMAGE)));
System.out.println("USer ID="+_userIdDB);
System.out.println("LAT="+_latDB);
System.out.println("LONG="+_longDB);
System.out.println("DATE="+ _dateDB);
System.out.println("MOb 1="+_mob1DB);
System.out.println("Mob 2="+_mob2DB);
System.out.println("Reason from db =" + _reasonSelected);
_cursor.moveToNext();
}
_cursor.close();
您的 db
变量未在 merge
中初始化。
假设您使用的是 SQLiteOpenHelper
,例如getWritableDatabase()
在辅助对象上获取一个 SQLiteDatabase
对象,您可以将其分配给 db
.