如何使用 android SQLite 游标在 table 中显示一行
How to use android SQLite cursors to show a row in the table
不要经常在这里提问,但我有一个 MyDBHelper class 和一个方法 'databaseToString',我很确定这是错误的,但我想做的是获取详细信息用户输入存储在 'details' table 中的表单,并使用游标将它们输出到单独的 fragment/listview 中。 (现在专注于一个 table)首先我认为我的方法 'databaseToString' 是错误的,因为我希望它获取用户输入的内容并在列表视图中显示所有列,其次我该怎么做用这个方法把游标的内容输出到一个新的listview/fragment?
已编辑 MyDBHelper class
package com.astuetz.viewpager.extensions.sample;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.Cursor;
import android.content.Context;
import android.content.ContentValues;
import java.util.ArrayList;
import java.util.List;
public class MyDBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "detailsDB.db";
public static final String TABLE_DETAILS = "details";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_FIRSTNAME = "firstname";
public static final String COLUMN_SURNAME = "surname";
public static final String COLUMN_PHONE = "phone";
public static final String COLUMN_EMAIL = "email";
public static final String COLUMN_ADDRESS1 = "address1";
public static final String COLUMN_ADDRESS2 = "address2";
public static final String TABLE_KIN_DETAILS = "kindetails";
public static final String COLUMN_KIN_ID = "_id";
public static final String COLUMN_KIN_YOUREMAIL = "youremailkin";
public static final String COLUMN_KIN_FIRSTNAME = "firstnamekin";
public static final String COLUMN_KIN_SURNAME = "surnamekin";
public static final String COLUMN_KIN_PHONE = "phonekin";
public static final String COLUMN_KIN_EMAIL = "emailkin";
public static final String COLUMN_KIN_ADDRESS1 = "address1kin";
public static final String COLUMN_KIN_ADDRESS2 = "address2kin";
// Pass database information along to superclass
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query = " CREATE TABLE " + TABLE_DETAILS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COLUMN_FIRSTNAME + " TEXT, "
+ COLUMN_SURNAME + " TEXT, "
+ COLUMN_PHONE + " TEXT, "
+ COLUMN_EMAIL + " TEXT, "
+ COLUMN_ADDRESS1 + " TEXT, "
+ COLUMN_ADDRESS2 + " TEXT "
+ ");";
String query2 = " CREATE TABLE " + TABLE_KIN_DETAILS + "("
+ COLUMN_KIN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COLUMN_KIN_YOUREMAIL + " TEXT, "
+ COLUMN_KIN_FIRSTNAME + " TEXT, "
+ COLUMN_KIN_SURNAME + " TEXT, "
+ COLUMN_KIN_PHONE + " TEXT, "
+ COLUMN_KIN_EMAIL + " TEXT, "
+ COLUMN_KIN_ADDRESS1 + " TEXT, "
+ COLUMN_KIN_ADDRESS2 + " TEXT "
+ ");";
db.execSQL(query);
db.execSQL(query2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" DROP TABLE IF EXISTS " + TABLE_DETAILS);
db.execSQL(" DROP TABLE IF EXISTS " + TABLE_KIN_DETAILS);
onCreate(db);
}
//Add a new row to the database
public void addDetails(Details details) {
ContentValues values = new ContentValues();
values.put(COLUMN_FIRSTNAME, details.getFirstname());
values.put(COLUMN_SURNAME, details.getSurname());
values.put(COLUMN_PHONE, details.getPhone());
values.put(COLUMN_EMAIL, details.getEmail());
values.put(COLUMN_ADDRESS1, details.getAddress1());
values.put(COLUMN_ADDRESS2, details.getAddress2());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_DETAILS, null, values);
db.close();
}
public void addKinDetails(KinDetails kinDetails){
ContentValues values = new ContentValues();
values.put(COLUMN_KIN_YOUREMAIL, kinDetails.getyourEmailkin());
values.put(COLUMN_KIN_FIRSTNAME, kinDetails.getFirstnamekin());
values.put(COLUMN_KIN_SURNAME, kinDetails.getSurnamekin());
values.put(COLUMN_KIN_PHONE, kinDetails.getPhonekin());
values.put(COLUMN_KIN_EMAIL, kinDetails.getEmailkin());
values.put(COLUMN_KIN_ADDRESS1, kinDetails.getAddress1kin());
values.put(COLUMN_KIN_ADDRESS2, kinDetails.getAddress2kin());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_KIN_DETAILS, null, values);
db.close();
}
public List<Details> getAllDetails(){
//create a new list in which we put all persons
List<Details>detailsList = new ArrayList<>();
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_DETAILS;
//Cursor points to a location in your results
Cursor c = db.rawQuery(query, null);
//Move to the first row in your results
if (c != null) {
c.moveToFirst();
//Position after the last row means the end of the results
while (!c.isAfterLast()) {
//create new details object
Details details = new Details();
//Here use static decalared on top of the class..dont use "" for the table column
details.set_id(c.getColumnIndex(COLUMN_ID));
details.setFirstname(c.getString(c.getColumnIndex(COLUMN_FIRSTNAME)));
details.setSurname(c.getString(c.getColumnIndex(COLUMN_SURNAME)));
details.setPhone(c.getString(c.getColumnIndex(COLUMN_PHONE)));
details.setEmail(c.getString(c.getColumnIndex(COLUMN_EMAIL)));
details.setAddress1(c.getString(c.getColumnIndex(COLUMN_ADDRESS1)));
details.setAddress2(c.getString(c.getColumnIndex(COLUMN_ADDRESS2)));
detailsList.add(details);
c.moveToNext();
}
c.close();
}
db.close();
//return our list of persons
return detailsList;
}
}
详情class
package com.astuetz.viewpager.extensions.sample;
public class Details {
int _id;
String firstname;
String surname;
String phone;
String email;
String address1;
String address2;
// Empty constructor
public Details(String s){
}
public void set_id(int _id) {
this._id = _id;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setEmail(String email) {
this.email = email;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public int get_id() {
return _id;
}
public String getFirstname() {
return firstname;
}
public String getSurname() {
return surname;
}
public String getPhone() {
return phone;
}
public String getEmail() {
return email;
}
public String getAddress1() {
return address1;
}
public String getAddress2() {
return address2;
}
}
LOGCAT 错误
Error:(126, 35) error: constructor Details in class Details cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length
我在一个按钮中有这个代码,执行 table 的 select 和一个游标来获取具有特定名称的列发送到一个字符串,最后将它设置为一个 textView : 检查出来!
BT6.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
String C1, C2, C3, C4;
String Fin="";
if (ET1.getText().toString().equals(""))
{
Fin="Ningun Resultado";
}
else
{
String SELECT_QUERY = "SELECT * FROM Tutores t1 INNER JOIN Tutorados t2 ON t1._id = t2.id_tutor and t1._id = " + ET1.getText().toString().trim();
cursor = db.rawQuery(SELECT_QUERY, null);
if (cursor.getCount() != 0) {
if (cursor.moveToFirst()) {
do {
C1 = cursor.getString(cursor
.getColumnIndex("_id"));
C2 = cursor.getString(cursor
.getColumnIndex("nombre_tutorado"));
C3 = cursor.getString(cursor
.getColumnIndex("id_tutor"));
C4 = cursor.getString(cursor
.getColumnIndex("nombre_tutor"));
Fin += C1 + "-" + C2 + "-" + C3 + "-"+ C4 + "\n";
} while (cursor.moveToNext());
}
}
cursor.close();
}
TV2.setText(Fin);
}
});
再见!
最好的方法是创建自定义对象来为您的示例管理数据,创建一个新的 java 文件并将其命名为 Person,以下是人 class(为了简化代码我们只做 2 个属性,您可以构建自己的所有字段):
public class Person {
//Properties
private String _id;
private String firstname;
//Constructor
public Person() {
}
//Getters and Setters
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
}
现在这个 person 对象可以在项目的任何地方使用,包括将它发送到 dbHandler 和从 dbHandler 获取。
例如在 dbHandler 中检索(不是 databaseToString ,以后尝试更恰当地命名方法):
更新 2
/**
* This method returns a list of persons objects
* @return
*/
public List<Person> getAllPersons(){
//create a new list in which we put all persons
List<Person>personsList = new ArrayList<>();
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_DETAILS;
//Cursor points to a location in your results
Cursor c = db.rawQuery(query, null);
//Move to the first row in your results
if (c != null) {
c.moveToFirst();
//Position after the last row means the end of the results
while (!c.isAfterLast()) {
//create new person object
Person person = new Person();
//Here use static decalred on top of the class..dont use "" for the table column
person.setFirstname(c.getString(c.getColumnIndex(COLUMN_FIRSTNAME)));
person.set_id(c.getString(c.getColumnIndex(COLUMN_ID)));
personsList.add(person);
c.moveToNext();
}
c.close();
}
db.close();
//return our list of persons
return persons;
}
LOGCAT 编辑
Error:(126, 35) error: constructor Details in class Details cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length
不要经常在这里提问,但我有一个 MyDBHelper class 和一个方法 'databaseToString',我很确定这是错误的,但我想做的是获取详细信息用户输入存储在 'details' table 中的表单,并使用游标将它们输出到单独的 fragment/listview 中。 (现在专注于一个 table)首先我认为我的方法 'databaseToString' 是错误的,因为我希望它获取用户输入的内容并在列表视图中显示所有列,其次我该怎么做用这个方法把游标的内容输出到一个新的listview/fragment?
已编辑 MyDBHelper class
package com.astuetz.viewpager.extensions.sample;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.Cursor;
import android.content.Context;
import android.content.ContentValues;
import java.util.ArrayList;
import java.util.List;
public class MyDBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "detailsDB.db";
public static final String TABLE_DETAILS = "details";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_FIRSTNAME = "firstname";
public static final String COLUMN_SURNAME = "surname";
public static final String COLUMN_PHONE = "phone";
public static final String COLUMN_EMAIL = "email";
public static final String COLUMN_ADDRESS1 = "address1";
public static final String COLUMN_ADDRESS2 = "address2";
public static final String TABLE_KIN_DETAILS = "kindetails";
public static final String COLUMN_KIN_ID = "_id";
public static final String COLUMN_KIN_YOUREMAIL = "youremailkin";
public static final String COLUMN_KIN_FIRSTNAME = "firstnamekin";
public static final String COLUMN_KIN_SURNAME = "surnamekin";
public static final String COLUMN_KIN_PHONE = "phonekin";
public static final String COLUMN_KIN_EMAIL = "emailkin";
public static final String COLUMN_KIN_ADDRESS1 = "address1kin";
public static final String COLUMN_KIN_ADDRESS2 = "address2kin";
// Pass database information along to superclass
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query = " CREATE TABLE " + TABLE_DETAILS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COLUMN_FIRSTNAME + " TEXT, "
+ COLUMN_SURNAME + " TEXT, "
+ COLUMN_PHONE + " TEXT, "
+ COLUMN_EMAIL + " TEXT, "
+ COLUMN_ADDRESS1 + " TEXT, "
+ COLUMN_ADDRESS2 + " TEXT "
+ ");";
String query2 = " CREATE TABLE " + TABLE_KIN_DETAILS + "("
+ COLUMN_KIN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COLUMN_KIN_YOUREMAIL + " TEXT, "
+ COLUMN_KIN_FIRSTNAME + " TEXT, "
+ COLUMN_KIN_SURNAME + " TEXT, "
+ COLUMN_KIN_PHONE + " TEXT, "
+ COLUMN_KIN_EMAIL + " TEXT, "
+ COLUMN_KIN_ADDRESS1 + " TEXT, "
+ COLUMN_KIN_ADDRESS2 + " TEXT "
+ ");";
db.execSQL(query);
db.execSQL(query2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" DROP TABLE IF EXISTS " + TABLE_DETAILS);
db.execSQL(" DROP TABLE IF EXISTS " + TABLE_KIN_DETAILS);
onCreate(db);
}
//Add a new row to the database
public void addDetails(Details details) {
ContentValues values = new ContentValues();
values.put(COLUMN_FIRSTNAME, details.getFirstname());
values.put(COLUMN_SURNAME, details.getSurname());
values.put(COLUMN_PHONE, details.getPhone());
values.put(COLUMN_EMAIL, details.getEmail());
values.put(COLUMN_ADDRESS1, details.getAddress1());
values.put(COLUMN_ADDRESS2, details.getAddress2());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_DETAILS, null, values);
db.close();
}
public void addKinDetails(KinDetails kinDetails){
ContentValues values = new ContentValues();
values.put(COLUMN_KIN_YOUREMAIL, kinDetails.getyourEmailkin());
values.put(COLUMN_KIN_FIRSTNAME, kinDetails.getFirstnamekin());
values.put(COLUMN_KIN_SURNAME, kinDetails.getSurnamekin());
values.put(COLUMN_KIN_PHONE, kinDetails.getPhonekin());
values.put(COLUMN_KIN_EMAIL, kinDetails.getEmailkin());
values.put(COLUMN_KIN_ADDRESS1, kinDetails.getAddress1kin());
values.put(COLUMN_KIN_ADDRESS2, kinDetails.getAddress2kin());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_KIN_DETAILS, null, values);
db.close();
}
public List<Details> getAllDetails(){
//create a new list in which we put all persons
List<Details>detailsList = new ArrayList<>();
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_DETAILS;
//Cursor points to a location in your results
Cursor c = db.rawQuery(query, null);
//Move to the first row in your results
if (c != null) {
c.moveToFirst();
//Position after the last row means the end of the results
while (!c.isAfterLast()) {
//create new details object
Details details = new Details();
//Here use static decalared on top of the class..dont use "" for the table column
details.set_id(c.getColumnIndex(COLUMN_ID));
details.setFirstname(c.getString(c.getColumnIndex(COLUMN_FIRSTNAME)));
details.setSurname(c.getString(c.getColumnIndex(COLUMN_SURNAME)));
details.setPhone(c.getString(c.getColumnIndex(COLUMN_PHONE)));
details.setEmail(c.getString(c.getColumnIndex(COLUMN_EMAIL)));
details.setAddress1(c.getString(c.getColumnIndex(COLUMN_ADDRESS1)));
details.setAddress2(c.getString(c.getColumnIndex(COLUMN_ADDRESS2)));
detailsList.add(details);
c.moveToNext();
}
c.close();
}
db.close();
//return our list of persons
return detailsList;
}
}
详情class
package com.astuetz.viewpager.extensions.sample;
public class Details {
int _id;
String firstname;
String surname;
String phone;
String email;
String address1;
String address2;
// Empty constructor
public Details(String s){
}
public void set_id(int _id) {
this._id = _id;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setEmail(String email) {
this.email = email;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public int get_id() {
return _id;
}
public String getFirstname() {
return firstname;
}
public String getSurname() {
return surname;
}
public String getPhone() {
return phone;
}
public String getEmail() {
return email;
}
public String getAddress1() {
return address1;
}
public String getAddress2() {
return address2;
}
}
LOGCAT 错误
Error:(126, 35) error: constructor Details in class Details cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length
我在一个按钮中有这个代码,执行 table 的 select 和一个游标来获取具有特定名称的列发送到一个字符串,最后将它设置为一个 textView : 检查出来!
BT6.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
String C1, C2, C3, C4;
String Fin="";
if (ET1.getText().toString().equals(""))
{
Fin="Ningun Resultado";
}
else
{
String SELECT_QUERY = "SELECT * FROM Tutores t1 INNER JOIN Tutorados t2 ON t1._id = t2.id_tutor and t1._id = " + ET1.getText().toString().trim();
cursor = db.rawQuery(SELECT_QUERY, null);
if (cursor.getCount() != 0) {
if (cursor.moveToFirst()) {
do {
C1 = cursor.getString(cursor
.getColumnIndex("_id"));
C2 = cursor.getString(cursor
.getColumnIndex("nombre_tutorado"));
C3 = cursor.getString(cursor
.getColumnIndex("id_tutor"));
C4 = cursor.getString(cursor
.getColumnIndex("nombre_tutor"));
Fin += C1 + "-" + C2 + "-" + C3 + "-"+ C4 + "\n";
} while (cursor.moveToNext());
}
}
cursor.close();
}
TV2.setText(Fin);
}
});
再见!
最好的方法是创建自定义对象来为您的示例管理数据,创建一个新的 java 文件并将其命名为 Person,以下是人 class(为了简化代码我们只做 2 个属性,您可以构建自己的所有字段):
public class Person {
//Properties
private String _id;
private String firstname;
//Constructor
public Person() {
}
//Getters and Setters
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
}
现在这个 person 对象可以在项目的任何地方使用,包括将它发送到 dbHandler 和从 dbHandler 获取。
例如在 dbHandler 中检索(不是 databaseToString ,以后尝试更恰当地命名方法):
更新 2
/**
* This method returns a list of persons objects
* @return
*/
public List<Person> getAllPersons(){
//create a new list in which we put all persons
List<Person>personsList = new ArrayList<>();
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_DETAILS;
//Cursor points to a location in your results
Cursor c = db.rawQuery(query, null);
//Move to the first row in your results
if (c != null) {
c.moveToFirst();
//Position after the last row means the end of the results
while (!c.isAfterLast()) {
//create new person object
Person person = new Person();
//Here use static decalred on top of the class..dont use "" for the table column
person.setFirstname(c.getString(c.getColumnIndex(COLUMN_FIRSTNAME)));
person.set_id(c.getString(c.getColumnIndex(COLUMN_ID)));
personsList.add(person);
c.moveToNext();
}
c.close();
}
db.close();
//return our list of persons
return persons;
}
LOGCAT 编辑
Error:(126, 35) error: constructor Details in class Details cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length