Android之SQLite數據庫存儲
一. 創建數據庫
-
創建一個 “數據庫管理器” 實體類來繼承
SQLiteOpenHelper
抽象類。其中需要重寫兩個方法用於創建數據庫和升級數據庫:onCreate()
和onUpgrade()
。 -
數據庫管理器的構造方法接收四個參數。第一個是
context
(環境),第二個是數據庫名,第三個是查詢數據返回的自定義的cursor
、一般都是null
,第四個是數據庫的版本號。 -
數據庫管理器實例的兩種方法,
getReadableDatabase()
和getWritableDatabase()
。這兩個都可以創建或打開一個數據庫,沒有的時候創建,存在的時候直接打開就行操作。(當數據庫不可以寫入的時候read以只讀方式打開,而write方式會出錯。)
創建一個BookStore.db數據庫,其中新建Book表
create table Book(
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text
)
這是SQL語句,代碼如下:
public class MyDatabaseHelper extends SQLiteOpenHelper {
/*建表語句定義成了一個字符串常量*/
public static final String CREATE_BOOK =
"create table Book("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text)";
private Context mContext;
/*數據庫管理器構造方法*/
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
/*創建數據庫,同時創建表*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_LONG).show();
}
/*升級數據庫*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在佈局中寫一個創建按鈕,然後MainActivity中的代碼如下:
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper.getWritableDatabase();
}
});
}
}
二. 添加數據
用insert()方法添加數據。
insert()方法接收三個參數:
- “表名”
- “默認空值”
- “傳入組裝好的數據values”
而其中用到的contentvalues數據類型則是用來組裝傳入內容的。相當於一個map組,用put來壓入數據。用完後要記得clear();代碼如下:
/*插入數據,insert方法傳入三個參數,“表名”“默認空值”“傳入組裝好的數據values”*/
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
/*用contentValues來組裝要插入的數據 未賦值的自動生成默認值*/
ContentValues values = new ContentValues();
// 開始組裝第一組數據
values.put("name", "The da vi code");
values.put("author", "Dan");
values.put("pages", 434);
values.put("price", 13.33);
db.insert("Book", null, values);//輸入第一行數據
values.clear();//清空values。
// 開始組裝第二條數據
values.put("name", "The lost");
values.put("author", "mask");
values.put("pages", 12);
values.put("price", 999);
db.insert("Book", null, values);//輸入第二行數據
values.clear();//清空values。
}
});
三. 更新數據
使用update()方法,傳入四個參數,分別是:
- “表名”
- “contentvalues值 修改的內容值”
- “SQL語句中的where約束條件”
- “where中的具體限定值”
同樣將要改變的數據壓入contentvalues中,然後傳入。代碼如下:
/*更新數據,使用update方法,傳入四個參數,
“表名”“修改的內容值”“SQL語句中的where”“where中的具體限定值”*/
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 1.2);
db.update("Book", values, "name=?", new String[]{"The da vi code"});
}
});
四. 刪除數據
使用delete()方法,不需要用content數據來傳數據,因爲只需要指定相應的數據進行刪除即可。delete()方法傳入三個參數:
- “表名”
- “SQL語句中的where約束條件”
- “where中的具體限定值”
代碼如下:
/*刪除數據,使用delete方法,傳入三個參數,
* “表名”“SQL語句中的where”“where中的具體限定值”*/
Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "pages>?", new String[]{"20"});
}
});
查詢數據
同時需要用到cursor對象(光標)來輸出查詢結果,將查詢結果賦給cursor對象,得到的cursor對象。
接着調用他的moveToFirst()方法將數據指針移動到第一行開始,然後加入循環,遍歷每一行數據,通過moveToNext()來進行跳轉。
通過cursor的getColumnIndex()方法獲得某一列在表中位置索引,然後將索引傳入相應的取值方法中,得到對應的數據。使用完後需要將cursor通過close關閉。
/*查詢數據,使用query方法,傳入參數較多。*/
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
//查詢book中所有數據
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
//遍歷cursor對象 取出數據並打印
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("MainActivity", "book name is " + name);
Log.d("MainActivity", "book author is " + author);
Log.d("MainActivity", "book pages is " + pages);
Log.d("MainActivity", "book price is " + price);
}while (cursor.moveToNext());
}
cursor.close();
}
});