如何使用 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