我正在开发一款应用。我想知道如何将用户的联系信息(姓名,图片,电话号码,地址)存储在SQLite中而无法添加到该数据库中? 更多单一条目信息,仅具有编辑功能。
你能给我提供很好的例子吗?
答案 0 :(得分:1)
以下是使用SQLite创建具有单个表和单行的数据库的基本示例。
有两个主要组成部分。应用程序活动中的代码和DBHelper类。
首先是DBHelper类: -
package your.package;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Mike092015 on 13/08/2016.
*/
public class MyDBHelper extends SQLiteOpenHelper {
// A few variables
public static final String DATABASE_NAME = "MYDB";
public static final int DATABASE_VERSION = 1;
// The Database Constructor
public MyDBHelper(Context ctxt, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(ctxt, DATABASE_NAME, factory, DATABASE_VERSION); }
@Override
public void onCreate(SQLiteDatabase db) {
String sqlstr = "CREATE TABLE IF NOT EXISTS MYUSERTABLE (_id INTEGER PRIMARY KEY, " +
"NAME TEXT NOT NULL, " +
"PICTURE TEXT, " +
"PHONE_NUMBER TEXT, " +
"ADDRESS TEXT);";
db.execSQL(sqlstr);
sqlstr = "INSERT INTO MYUSERTABLE (_id, NAME, PICTURE, PHONE_NUMBER, ADDRESS) " +
"VALUES('0','MYNAME','MYPICTURE_LINK','00 0000 0000','NONE');";
db.execSQL(sqlstr);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
//DO NOTHING
}
public Cursor getUserAsCursor() {
String sqlstr = "SELECT * FROM MYUSERTABLE;";
SQLiteDatabase db = this.getReadableDatabase();
return db.rawQuery(sqlstr,null);
}
}
创建MyDBHelper实例将创建数据库(如果它不存在(当尝试通过getReadableDatabase()
或getWritableDatabase()
打开数据库时)并导致onCreate
要调用的方法,其中创建表并使用一行填充该表。如果数据库已经存在,则不会调用onCreate
,因此不会触及表格。请注意,实例将在另一个活动中创建(请参阅后面的内容)。
如果版本号增加,则会调用onUpgrade
方法(我已经这样做了所以它没有做任何事情(我个人不会使用它而不是我使用的方法创建一个伪随机模式根据值将其与实际模式进行比较,然后相应地添加额外的表/行))。但是,目前不担心升级。只需删除应用程序的数据即可重新开始。
引入了一种方法,即getUserAsCursor
,它将返回一个SQLite游标(以列为元素的行数组)。这用于调用活动。
第二个代码是调用活动,是: -
package your.package;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class Main extends AppCompatActivity {
public MyDBHelper myDBHelper = new MyDBHelper(this,null,null,1);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
Cursor csr = myDBHelper.getUserAsCursor();
Toast.makeText(this,"Cursor Count returns " + csr.getCount() +
"\nNumber of Columns is " + csr.getColumnCount(),
Toast.LENGTH_LONG).show();
csr.moveToFirst();
if(csr.getCount() > 0) {
Toast.makeText(this,"Name==> " + csr.getString(1) + "\n" +
"Picture==> " + csr.getString(2) + "\n" +
"Phone Number==> " + csr.getString(3) + "\n" +
"Address===> " + csr.getString(4),Toast.LENGTH_LONG).show();
}
else {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
myDBHelper.close();
}
}
相关代码的各个方面是: -
public MyDBHelper myDBHelper = new MyDBHelper(this,null,null,1);
创建数据库实例。正如前所述,这创建了数据库和仅在数据库不存在时才填充的表。
Cursor csr = myDBHelper.getUserAsCursor();
这将调用getUserAsCursor
方法返回一个游标,该游标包含表中所有行的所有列。根据SQL查询SELECT * FROM MYUSERTABLE;
(选择名为MYUSERTABLE的表中的所有列)。
Toast.makeText(this,"Cursor Count returns " + csr.getCount() +
"\nNumber of Columns is " + csr.getColumnCount(),
Toast.LENGTH_LONG).show();
是调试信息。它生成一个toast,表示返回游标中包含多少行和列。
csr.moveToFirst();
这将移动到第一个数据/行(我不确定该术语是什么,但是光标最初位于标题处,试图访问它是否是一行会导致' OutofBounds'错误)。
if(csr.getCount() > 0) {
Toast.makeText(this,"Name==> " + csr.getString(1) + "\n" +
"Picture==> " + csr.getString(2) + "\n" +
"Phone Number==> " + csr.getString(3) + "\n" +
"Address===> " + csr.getString(4),Toast.LENGTH_LONG).show();
}
这将从行中的列访问数据并发出显示数据的Toast。正如您所看到的,它使用游标' getString`方法获取行的索引(从0开始)。
您可能想知道为什么我将_id列为表格中的一列。这是因为某些内容(例如cursorAdapters
(由ListViews
使用))期望这样的列。
关于更新用户。以下是如何实现这一目标的一个例子。这个基本示例根据以下内容向DBHelper添加了另一种方法upDateUser
: -
public void upDateUser(String newname, String newpicture, String newphonenumber, String newaddress) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("NAME",newname);
cv.put("PICTURE",newpicture);
String where = "_id = ? ";
String[] whereargs = new String[] {String.valueOf(0)};
db.update("MYUSERTABLE", cv, where, whereargs);
db.close();
}
请注意,您可以通过db.execSQL使用查询来执行相同操作。但是,使用contentValues和更新方法被认为是更好的做法(我相信)
然后在活动中通过(在上面的代码之后)调用: -
myDBHelper.upDateUser("Fred", "A NEW PICTURE", "11 1111 1111","0 NOWHERE TOWN");
然后复制下面的代码(如前所述),将显示更改/更新的记录(请注意,在这种情况下,这只会显示创建数据库/表/行后第一次运行时的更改,后续运行将显示相同的数据): -
csr = myDBHelper.getUserAsCursor(); // get DB cursor via getUserAsCursor method
Toast.makeText(this,"Cursor Count returns " + csr.getCount() +
"\nNumber of Columns is " + csr.getColumnCount(),
Toast.LENGTH_LONG).show(); // Show, via toast, # of rows and # of columns
csr.moveToFirst();
if(csr.getCount() > 0) {
Toast.makeText(this,"Name==> " + csr.getString(1) + "\n" +
"Picture==> " + csr.getString(2) + "\n" +
"Phone Number==> " + csr.getString(3) + "\n" +
"Address===> " + csr.getString(4),Toast.LENGTH_LONG).show();
}
else {
}
请注意,虽然已经提到了最佳做法,但是为了便于制作这个答案,我们已经使用了一些避风港(即我有点懒惰)。
答案 1 :(得分:0)
假设您只需要修改一个用户,您可以执行以下操作。
使用GSON将User对象设为JSON字符串。
将此用户类JSON字符串存储在SharedPreference。
在必要时从SharedPreference获取用户JSON字符串,并将其从JSON字符串转换为User类。