Java 如何在SQLite中保存和检索特定行中的数据?

Java 如何在SQLite中保存和检索特定行中的数据?,java,android,sqlite,Java,Android,Sqlite,我正在制作一个应用程序,用户可以登录到他的帐户,通过EditText中的内容,然后它将显示在TextView中。我的目的是保存并显示每个用户自己的文本。这是我到目前为止得到的 public class DatabaseHelper extends SQLiteOpenHelper { // Database Version private static final int DATABASE_VERSION = 3; // Database Name privat

我正在制作一个应用程序,用户可以登录到他的帐户,通过
EditText
中的内容,然后它将显示在
TextView
中。我的目的是保存并显示每个用户自己的文本。这是我到目前为止得到的

public class DatabaseHelper extends SQLiteOpenHelper {
    // Database Version
    private static final int DATABASE_VERSION = 3;

    // Database Name
    private static final String DATABASE_NAME = "UserManager.db";

    // User table name
    private static final String TABLE_USER = "user";

    // User Table Columns names
    private static final String COLUMN_USER_ID = "userid";
    private static final String COLUMN_USER_NAME = "user_name";
    private static final String COLUMN_USER_PASSWORD = "user_password";
    private static final String COLUMN_USER_HOURS = "user_hours";

    // create table sql query
    private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "("
            + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_USER_NAME + " TEXT,"
            + COLUMN_USER_PASSWORD + " TEXT," + COLUMN_USER_HOURS + " TEXT" + ")";

    // drop table sql query
    private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_USER;
    SQLiteDatabase db;


    /**
     * Constructor
     *
     * @param context
     */
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 3);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        this.db = sqLiteDatabase;
        db.execSQL(CREATE_USER_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //Drop User Table if exist
        db.execSQL(DROP_USER_TABLE);
        // Create tables again
        onCreate(db);

    }

    public void addUser(User user) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(COLUMN_USER_NAME, user.getName());
        values.put(COLUMN_USER_PASSWORD, user.getPassword());

        // Inserting Row
        db.insert(TABLE_USER, null, values);
        db.close();
    }

    public boolean checkUser(String name, String password) {

        // array of columns to fetch
        String[] columns = {
                COLUMN_USER_ID
        };
        SQLiteDatabase db = this.getReadableDatabase();
        // selection criteria
        String selection = COLUMN_USER_NAME + " = ?" + " AND " + COLUMN_USER_PASSWORD + " = ?";

        // selection arguments
        String[] selectionArgs = {name, password};

        Cursor cursor = db.query(TABLE_USER, //Table to query
                columns,                    //columns to return
                selection,                  //columns for the WHERE clause
                selectionArgs,              //The values for the WHERE clause
                null,                       //group the rows
                null,                       //filter by row groups
                null);                      //The sort order

        int cursorCount = cursor.getCount();

        cursor.close();
        db.close();
        if (cursorCount > 0) {
            return true;
        }

        return false;
    }

    public void updateData(UserData userData) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(COLUMN_USER_HOURS, userData.getHours() );

        // updating row
        db.update(TABLE_USER, values, COLUMN_USER_HOURS + " = ?",
                new String[]{String.valueOf(userData.getHours())});
        db.close();
    }
我希望存储用户的EditText值,并从列
列\u user\u HOUR
中检索。遗憾的是,我不知道如何一起设置它 ,我假设应该为每个用户的id标识
列\u USER\u HOUR
。谢谢帮助;) 这是用户数据

public class UserData {
    private String hours;

    public String getHours(){
        return hours;
    }

    public void setHours(String hours){
        this.hours = hours;}

}

您可以将
upDateData
方法更改如下:-

public int updateData(long userid, UserData userData) {
    int rv;
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(COLUMN_USER_HOURS, userData.getHours() );

    // updating row
    rv = db.update(TABLE_USER, values, COLUMN_USER_ID + " = ?",
            new String[]{Long.toString(userid)});
    db.close();
    return rv;
}
因此,如果您传递用户ID以及要更改的数据,该方法将返回所做更新的次数(如果有效,则返回1;如果未更新,则返回0)


答复:-
我知道这一点,但现在我只想知道如何存钱和存钱 检索唯一用户的数据(当用户登录到其帐户时,我希望 在文本视图中显示他通过edittext在数据中存储的内容)i 我知道这听起来很奇怪,但我想知道怎么做 数据结构:)

类似的更改,而不是返回布尔值,返回用户ID(如果失败,则返回0),例如:-

您可以使用
getHours
方法,如:-

public String getHours(long id) {
    String rv = "";
    SQLiteDatabase db = this.getWriteableDatabase();
    Cursor cursor = db.query(TABLE_USER, 
        null,
        COLUMN_USER_ID = "+?",
        new String[]{Long.toString(id)},
        null,null,null
    );
    if (cursor.moveToFirst()) {
        rv = cursor.getString(cursor.getColumnIndex(COLUMN_USER_HOURS));
    }
    cursor.close();
    db.close();
    return rv;
}
您的活动可以包括以下内容:-

    DatabaseHelper dbhlpr = new DatabaseHelper(this);
    long current_userid = dbhlpr.checkUser(
            username_EditText.getText().toString(),
            userpassword_EditText.gettext.toString());
    if (current_userid > 0) {
        hours_TextView.settext(dbhlpr.getHours(current_userid));
    } else {
        //.... handle invalid login attempt here.
    }

查看官方文件室库,省去编写所有SQLiteOpenHelper代码的麻烦。我有点困惑,但我想我会处理这个:),现在我想知道如何将用户数据检索到他的UserActivity
TextView
,这取决于您可以获取用户ID的UserData类,即
UserData.getId()
如果getter存在并被调用,则返回long。如果您知道用户名是unqiue,可以使用它,例如
newstring[]{userData.getUserName()}),如果getter存在,请再次输入。目前,我的UserData在我的问题中是这样的(我添加了它),我知道用户名是唯一的。您尝试的问题是,您基本上是说更新小时数为10(或小时数的任何值)的行,并将其更改为10小时。我知道,但现在我只想知道如何为唯一的用户保存和检索数据(当用户登录到他的帐户时,我想在textview中显示他通过edittext在数据中存储的内容),我知道这听起来很奇怪,但我正试着理解如何构造数据:)
    DatabaseHelper dbhlpr = new DatabaseHelper(this);
    long current_userid = dbhlpr.checkUser(
            username_EditText.getText().toString(),
            userpassword_EditText.gettext.toString());
    if (current_userid > 0) {
        hours_TextView.settext(dbhlpr.getHours(current_userid));
    } else {
        //.... handle invalid login attempt here.
    }