目录
数据库
在Android中,数据库存储主要有两种方式:一种是使用原生的SQLite数据库,另一种是使用Room持久化库(它是SQLite的抽象层,提供了更安全和方便的API),本章主要讲原生的SQLite数据库。
1.SQLite数据库
SQLite是Android内置的轻量级关系型数据库,它支持标准的SQL语法和ACID事务。每个数据库都是设备上的一个文件,通常位于应用沙盒内,只有应用本身可以访问。
SQLite数据库的基础语法可以参考下列链接。
第五章 SQLite数据库:1、SQLite 基础语法及使用案例
1.1数据库管理器SQLiteDatabase
SQLiteDataBase是Android提供的SQLite数据库管理器,可以在Java代码中调用方法openOrCreateDatabase来获取数据库实例。如下方的示例代码:布局文件中设置两个按钮,一个文本视图。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Storage.DataBaseActivity"
android:orientation="vertical">
<Button
android:id="@+id/button_create"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"/>
<Button
android:id="@+id/button_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据库"/>
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>
部分Java代码,主要是按钮监听器中的逻辑处理。
@Override
public void onClick(View view) {
if(view.getId() == R.id.button_create){
SQLiteDatabase sqLiteDatabase = openOrCreateDatabase( getFilesDir()+"/mySQLiteDatabase.bd",MODE_PRIVATE,null);
//下面这种方式也可以创建数据库
// SQLiteDatabase sqLiteDatabase = SQLiteDatabase.openDatabase(getFilesDir() + "/mydatabse.bd",null, SQLiteDatabase.CREATE_IF_NECESSARY);
String string = String.format("%s\n数据库%s创建%s!",textView.getText(),sqLiteDatabase.getPath(),(sqLiteDatabase != null) ? "成功":"失败");
textView.setText(string);
}
else{
boolean is_delete = deleteDatabase(getFilesDir() + "/mySQLiteDatabase.bd");
textView.setText(textView.getText() + String.format("\n数据库删除%s",is_delete?"成功":"失败"));
}
}
效果图如下,一次点击两个按钮,先创建数据库后删除数据库。

根据路径可以查看到对应的数据库所在。

1.2数据库帮助器SQLiteOpenHelper
对于数据库管理器其实存在局限性,有时候会重复打开数据库,处理数据库的升级也不方便。对此Android提供了数据库帮助器SQLIteOpenHelper,帮助开发者更合理使用SQLite。SQLIteOpenHelper类中有两个方法,onCreate方法只在第一次打开数据库连接时调用,在这里可以创建表结构;onUpgrade方法在数据库版本升高时调用,在这里可以更据版本变化修改表结构。示例代码如下。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Storage.DataBaseActivity">
<EditText
android:id="@+id/editText_Name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Name"
android:inputType="text" />
<EditText
android:id="@+id/editText_Age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Age"
android:inputType="number" />
<RadioGroup
android:id="@+id/radioGroup_gender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radio_male"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="男" />
<RadioButton
android:id="@+id/radio_female"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="女" />
<RadioButton
android:id="@+id/radio_other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="true"
android:text="其他" />
</RadioGroup>
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="3"
android:rowCount="2">
<Button
android:id="@+id/button_Add"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:text="添加" />
<Button
android:id="@+id/button_Write"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:text="提交" />
<Button
android:id="@+id/button_Read"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:text="读取" />
<Button
android:id="@+id/button_Delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:text="删除" />
<Button
android:id="@+id/button_DeleteAll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:text="删除全部" />
<Button
android:id="@+id/button_Update"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:text="更新" />
</GridLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取结果:\n" />
</ScrollView>
</LinearLayout>
UserInfo类的Java代码。
public class UserInfo {
private long _id;
private String Name;
private int Age;
private String gender;
private String time;
public long get_id() {
return _id;
}
public void set_id(long _id) {
this._id = _id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
自定义数据库帮助器类的Java代码。
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private static MySQLiteOpenHelper mySQLiteOpenHelper = null;//数据库帮助器的实例
private static SQLiteDatabase sqLiteDatabase = null;//数据库的实例
private static String DataBaseName;//数据库名
private static String TableName;//表名
public static MySQLiteOpenHelper getInstance(Context context, int version, String databaseName, String tableName) {
if (version > 0 && mySQLiteOpenHelper == null) {
mySQLiteOpenHelper = new MySQLiteOpenHelper(context, version, databaseName);
DataBaseName = databaseName;
TableName = tableName;
}
return mySQLiteOpenHelper;
}
private MySQLiteOpenHelper(Context context, int version, String dataBaseName) {
super(context, dataBaseName, null, version);
}
//开启读取连接
public SQLiteDatabase openReadLink() {
if (sqLiteDatabase == null || !sqLiteDatabase.isOpen()) {
sqLiteDatabase = mySQLiteOpenHelper.getReadableDatabase();
}
return sqLiteDatabase;
}
//开启写入连接
public SQLiteDatabase openWriteLink() {
if (sqLiteDatabase == null || !sqLiteDatabase.isOpen()) {
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
}
return sqLiteDatabase;
}
//关闭连接
public void closeLink() {
if (sqLiteDatabase != null && sqLiteDatabase.isOpen()) {
sqLiteDatabase.close();
sqLiteDatabase = null;
}
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//建表SQL语句
String create_table_sql = "CREATE TABLE IF NOT EXISTS " + TableName +
" (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"//主键
+ "name VARCHAR NOT NULL," + "age INTEGER NOT NULL,"//名字、年龄
+ "gender VARCHAR NOT NULL," + "update_time VARCHAR NOT NULL" + ");";//性别、添加或更新时间
sqLiteDatabase.execSQL(create_table_sql); // 执行完整的SQL语句
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersoin, int newVersion) {
}
//查询
public List<UserInfo> query(String tableName,String condition){
String query_sql = String.format( "SELECT * FROM %s WHERE %s",tableName,condition);
Cursor cursor = sqLiteDatabase.rawQuery(query_sql,null);
List<UserInfo> userInfoList = new ArrayList<UserInfo>();
while (cursor.moveToNext()){
UserInfo userInfo = new UserInfo();
userInfo.set_id(cursor.getLong(0));
userInfo.setName(cursor.getString(1));
userInfo.setAge(cursor.getInt(2));
userInfo.setGender(cursor.getString(3));
userInfo.setTime(cursor.getString(4));
userInfoList.add(userInfo);
}
cursor.close();
return userInfoList;
}
//增加记录
public long insert(List<UserInfo> userInfoList,String tableName){
long result = -1;
for(int i = 0; i < userInfoList.size(); i++){
UserInfo userInfo = userInfoList.get(i);
ContentValues contentValues = new ContentValues();
contentValues.put("name",userInfo.getName());
contentValues.put("age",userInfo.getAge());
contentValues.put("gender",userInfo.getGender());
contentValues.put("update_time",userInfo.getTime());
result = sqLiteDatabase.insert(tableName,"",contentValues);
if(result == -1){
return result;
}
}
return result;
}
//删除记录
public int delete(String tableName,String condition){
return sqLiteDatabase.delete(tableName,condition,null);
}
//删除全部记录
public int deleteAll(String tableName){
return sqLiteDatabase.delete(tableName,"_id>0",null);
}
//更新记录
public int upDate(String tableName,UserInfo userInfo,String condition){
ContentValues contentValues = new ContentValues();
contentValues.put("name",userInfo.getName());
contentValues.put("age",userInfo.getAge());
contentValues.put("gender",userInfo.getGender());
contentValues.put("update_time",userInfo.getTime());
return sqLiteDatabase.update(tableName,contentValues,condition,null);
}
}
Activity中的Java代码。
public class DataBaseActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {
private EditText editText_Name, editText_Age;
private RadioGroup radioGroup_gender;
private Button button_Write, button_Read, button_Add, button_Delete, button_DeleteAll, button_Update;
private TextView textView;
private String gender = "其他";
private MySQLiteOpenHelper mySQLiteOpenHelper;
private List<UserInfo> userInfoList = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_base);
editText_Name = findViewById(R.id.editText_Name);
editText_Age = findViewById(R.id.editText_Age);
radioGroup_gender = findViewById(R.id.radioGroup_gender);
button_Write = findViewById(R.id.button_Write);
button_Read = findViewById(R.id.button_Read);
button_Add = findViewById(R.id.button_Add);
button_Delete = findViewById(R.id.button_Delete);
button_DeleteAll = findViewById(R.id.button_DeleteAll);
button_Update = findViewById(R.id.button_Update);
textView = findViewById(R.id.textView);
button_Write.setOnClickListener(this);
button_Read.setOnClickListener(this);
button_Add.setOnClickListener(this);
button_Delete.setOnClickListener(this);
button_DeleteAll.setOnClickListener(this);
button_Update.setOnClickListener(this);
radioGroup_gender.setOnCheckedChangeListener(this);
mySQLiteOpenHelper = MySQLiteOpenHelper.getInstance(this, 1, "HelperDataBase", "userInfo");
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.button_Add) {
if (userInfoList == null) {
userInfoList = new ArrayList<UserInfo>();
}
UserInfo userInfo = new UserInfo();
Calendar calendar = Calendar.getInstance();
String time = String.format("%s:%s:%s.%s", calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
String Name = editText_Name.getText().toString();
String Age = editText_Age.getText().toString();
userInfo.setTime(time);
userInfo.setName(Name);
userInfo.setAge(Integer.parseInt(Age));
userInfo.setGender(gender);
boolean is = userInfoList.add(userInfo);
Log.d(TAG, String.format("%s", is ? "成功" : "失败"));
} else if (view.getId() == R.id.button_Write) {
mySQLiteOpenHelper.openWriteLink();
long result = mySQLiteOpenHelper.insert(userInfoList, "userInfo");
if (result != -1) {
textView.setText(textView.getText() + "添加成功!\n");
userInfoList = null;
mySQLiteOpenHelper.closeLink();
} else {
textView.setText(textView.getText() + "添加失败!\n");
mySQLiteOpenHelper.closeLink();
}
} else if (view.getId() == R.id.button_Read) {
mySQLiteOpenHelper.openReadLink();
userInfoList = mySQLiteOpenHelper.query("userInfo", "_id>0");
for (int i = 0; i < userInfoList.size(); i++) {
UserInfo userInfo = userInfoList.get(i);
String string = String.format("ID:%d\nName:%s\nAge:%d\ngender:%s\ntime:%s\n", userInfo.get_id(), userInfo.getName(), userInfo.getAge(), userInfo.getGender(), userInfo.getTime());
textView.setText(textView.getText() + string);
}
mySQLiteOpenHelper.closeLink();
} else if (view.getId() == R.id.button_Delete) {
mySQLiteOpenHelper.openWriteLink();
mySQLiteOpenHelper.delete("userInfo","age<18");
} else if (view.getId() == R.id.button_DeleteAll) {
mySQLiteOpenHelper.openWriteLink();
mySQLiteOpenHelper.deleteAll("userInfo");
} else {
mySQLiteOpenHelper.openWriteLink();
UserInfo userInfo = new UserInfo();
userInfo.setName(editText_Name.getText().toString());
userInfo.setAge(Integer.parseInt(editText_Age.getText().toString()));
userInfo.setGender(gender);
Calendar calendar = Calendar.getInstance();
String time = String.format("%s:%s:%s.%s", calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
userInfo.setTime(time);
mySQLiteOpenHelper.upDate("userInfo",userInfo,"_id=1");
}
}
@Override
public void onCheckedChanged(RadioGroup radioGroup, int id) {
if (id == R.id.radio_male) {
gender = "男";
} else if (id == R.id.radio_female) {
gender = "女";
} else {
gender = "其他";
}
}
}
效果图如下,输入信息后依次点击添加按钮、提交按钮、读取按钮可以看到数据已经写入数据库中;再次输入信息后点击更新按钮,再点击读取按钮,可以看到数据库的第一项的年龄以及时间改变了;点击删除按钮再点击读取按钮,可以看到数据并没有发生改变,是因为要删除的条件是年龄小于18,因此没有变化;点击删除全部按钮再点击读取发现并没有读取到数据,说明数据库中的userInfo表是空的。


3783

被折叠的 条评论
为什么被折叠?



