Android 将SQLite查询结果存储在字符串数组中
如何将查询结果保存在字符串数组中?Android 将SQLite查询结果存储在字符串数组中,android,sql,sqlite,listview,android-sqlite,Android,Sql,Sqlite,Listview,Android Sqlite,如何将查询结果保存在字符串数组中? 查询很简单,只有一列,即: SELECT NAME FROM MYTABLE 我想要的是将ID存储在字符串数组中,这样我就可以在列表视图中将它们显示为可单击的项 String selectQuery = "SELECT * FROM table"; try { Cursor cursor = db.rawQuery(selectQuery, null); ArrayList<String
查询很简单,只有一列,即:
SELECT NAME FROM MYTABLE
我想要的是将ID存储在字符串数组中,这样我就可以在列表视图中将它们显示为可单击的项
String selectQuery = "SELECT * FROM table";
try {
Cursor cursor = db.rawQuery(selectQuery, null);
ArrayList<String> ids = new ArrayList<>();
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
String id = cursor.getString(cursor.getColumnIndex(KEY_ID));
ids.add(id);
} while (cursor.moveToNext());
}
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
String selectQuery=“从表中选择*”;
试一试{
Cursor Cursor=db.rawQuery(selectQuery,null);
ArrayList ID=新的ArrayList();
//循环遍历所有行并添加到列表
if(cursor.moveToFirst()){
做{
字符串id=cursor.getString(cursor.getColumnIndex(KEY_id));
添加(id);
}while(cursor.moveToNext());
}
cursor.close();
}捕获(例外e){
e、 printStackTrace();
}
假设您已经对一个对象执行了查询,并收到了一个返回值,您可以遍历光标并将每一行的值保存到字符串[]
数组中,如下所示:
String[] names;
if (cursor.moveToFirst()) {
names = new String[cursor.getCount()];
int colIndex = cursor.getColumnIndex("NAME");
do {
names[cursor.getPosition()] = cursor.getString(colIndex);
} while (cursor.moveToNext());
}
请记住,如果没有返回任何行,names
将null
,因此请确保执行空检查。在SQLiteOpenHelper类中创建以下方法
public List<String> getAllNames() {
List<String> retData = new ArrayList<String>();
String selectQuery = "SELECT NAME FROM MYTABLE";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
retData.add(cursor.getString(0));
} while (cursor.moveToNext());
}
return retData;
}
public List getAllNames(){
List retData=new ArrayList();
String selectQuery=“从MYTABLE中选择名称”;
SQLiteDatabase db=this.getWritableDatabase();
Cursor Cursor=db.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
做{
retData.add(cursor.getString(0));
}while(cursor.moveToNext());
}
返回数据;
}
然后将返回的列表分配给适配器。列表id的问题是,它们对最终用户来说往往没有意义。确实,您希望显示用户有意义的数据,例如名称,但随后能够访问相应的id,从而有效地对显示给用户的列表中的选择进行操作
使用ArrayList通常会导致很多挫折,因为该列表显示了所需的内容,但在尝试使用列表时,除了显示数据之外,它几乎没有什么用处,例如,选择一个项目,然后执行诸如删除或更新之类的操作(如果该值在数据库中是唯一的,则可以使用它)
因此,ArrayList
而不是ArrayList
通常更适合作为列表的源;游标适配器也可以用作从基础行轻松获取数据的工具
但是,在使用ArrayList时存在一个问题,除非使用自定义数组适配器,ArrayAdapter
类使用对象的toString
方法检索显示的数据。简单的解决方法是在对象中提供一个合适的toString
方法,如果您不这样做,您将在的行中得到一些长的东西。”SomeType@2f92e0f4“
示例显示了所有3个
在以下工作示例中:-
- 数据库(mydb)有一个名为mytable的表,该表有两列\u id(注意对于游标适配器,必须是\u id)
- 有3种方法可获取3种类型的列表(相应命名):-
- GetAllassTringrayList(获取数组列表)
- getAllAsMyTableObjectArrayList(获取ArrayList)。注释使用MyTableObject类(请参见类中的注释重新覆盖默认的toString方法)
- getAllAsCursor
- 应用程序运行时将有3个列表,左侧基于第一个ArrayList,中间基于ArrayList,最后一个基于光标
- 单击任何列表中的项目都会显示相应的名称,并尝试获取id
- ArrayList左侧列表在这方面失败,因为它只能获取位置(即,传递给侦听器的第四个参数的值与位置相同)
- 从对象(通过适配器的getItem(position)方法检索)获取id时,ArrayList中间列表成功检索到正确的id,第四个参数与位置相同,不应使用
- 光标右列表通过光标和第四个参数检索正确的id
代码
MyTableObject.java:-
public class MyTableObject {
private long id;
private String name;
public MyTableObject(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*
NOTE toString method returns just the name
*/
@Override
public String toString() {
return name;
}
}
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String TB_MYTABLE = "mytable";
public static final String COl_MYTABLE_ID = BaseColumns._ID; //<<<< use standard android id column name
public static final String COL_MYTABLE_NAME = "_name";
private static final String mytable_crtsql =
"CREATE TABLE IF NOT EXISTS " + TB_MYTABLE +
"(" +
COl_MYTABLE_ID + " INTEGER PRIMARY KEY, " +
COL_MYTABLE_NAME + " TEXT " +
")";
SQLiteDatabase mDB;
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(mytable_crtsql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long addRow(String name) {
ContentValues cv = new ContentValues();
cv.put(COL_MYTABLE_NAME,name);
return mDB.insert(TB_MYTABLE,null,cv);
}
public ArrayList<String> getAllAsStringArrayList() {
ArrayList<String> rv = new ArrayList<>();
Cursor csr = mDB.query(
TB_MYTABLE,
null,
null,
null,
null,
null,
null
);
while (csr.moveToNext()) {
rv.add(csr.getString(csr.getColumnIndex(COL_MYTABLE_NAME)));
}
csr.close();
return rv;
}
public ArrayList<MyTableObject> getAllAsMyTableObjectArrayList() {
ArrayList<MyTableObject> rv = new ArrayList<>();
Cursor csr = mDB.query(
TB_MYTABLE,
null,
null,
null,
null,
null,
null
);
while (csr.moveToNext()) {
rv.add(new MyTableObject(
csr.getLong(csr.getColumnIndex(COl_MYTABLE_ID)),
csr.getString(csr.getColumnIndex(COL_MYTABLE_NAME))
)
);
}
csr.close();
return rv;
}
public Cursor getAllAsCursor() {
return mDB.query(
TB_MYTABLE,
null,
null,
null,
null,
null,
null
);
}
}
DatabaseHelper.java:-
public class MyTableObject {
private long id;
private String name;
public MyTableObject(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*
NOTE toString method returns just the name
*/
@Override
public String toString() {
return name;
}
}
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String TB_MYTABLE = "mytable";
public static final String COl_MYTABLE_ID = BaseColumns._ID; //<<<< use standard android id column name
public static final String COL_MYTABLE_NAME = "_name";
private static final String mytable_crtsql =
"CREATE TABLE IF NOT EXISTS " + TB_MYTABLE +
"(" +
COl_MYTABLE_ID + " INTEGER PRIMARY KEY, " +
COL_MYTABLE_NAME + " TEXT " +
")";
SQLiteDatabase mDB;
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(mytable_crtsql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long addRow(String name) {
ContentValues cv = new ContentValues();
cv.put(COL_MYTABLE_NAME,name);
return mDB.insert(TB_MYTABLE,null,cv);
}
public ArrayList<String> getAllAsStringArrayList() {
ArrayList<String> rv = new ArrayList<>();
Cursor csr = mDB.query(
TB_MYTABLE,
null,
null,
null,
null,
null,
null
);
while (csr.moveToNext()) {
rv.add(csr.getString(csr.getColumnIndex(COL_MYTABLE_NAME)));
}
csr.close();
return rv;
}
public ArrayList<MyTableObject> getAllAsMyTableObjectArrayList() {
ArrayList<MyTableObject> rv = new ArrayList<>();
Cursor csr = mDB.query(
TB_MYTABLE,
null,
null,
null,
null,
null,
null
);
while (csr.moveToNext()) {
rv.add(new MyTableObject(
csr.getLong(csr.getColumnIndex(COl_MYTABLE_ID)),
csr.getString(csr.getColumnIndex(COL_MYTABLE_NAME))
)
);
}
csr.close();
return rv;
}
public Cursor getAllAsCursor() {
return mDB.query(
TB_MYTABLE,
null,
null,
null,
null,
null,
null
);
}
}
public类DatabaseHelper扩展了SQLiteOpenHelper{
公共静态最终字符串DBNAME=“mydb”;
公共静态最终int DBVERSION=1;
公共静态最终字符串TB_MYTABLE=“MYTABLE”;
公共静态最终字符串COl\u MYTABLE\u ID=BaseColumns.\u ID//