Android SQLite数据库相关API的介绍可以看这篇文章
Android SQLite数据库中基础的增删改查操作以及API的详解
效果如图所示:
一、向数据库中写入数据
1.首先创建数据库user和表user_info,详细的注释已经在代码中给出
public class UserDBHelper extends SQLiteOpenHelper { private static final String TAG = "UserDBHelper"; //声明数据库帮助器的实例 public static UserDBHelper userDBHelper = null; //声明数据库的实例 private SQLiteDatabase db = null; //声明数据库的名称 public static final String DB_NAME = "user.db"; //声明表的名称 public static final String TABLE_NAME = "user_info"; //声明数据库的版本号 public static int DB_VERSION = 1; public UserDBHelper(@Nullable Context context) { super(context, DB_NAME, null, DB_VERSION); } public UserDBHelper(@Nullable Context context, int version) { super(context, DB_NAME, null, version); } //利用单例模式获取数据库帮助器的实例 public static UserDBHelper getInstance(Context context, int version) { if (userDBHelper == null && version > 0) { userDBHelper = new UserDBHelper(context, version); } else if (userDBHelper == null) { userDBHelper = new UserDBHelper(context); } return userDBHelper; } //打开数据库的写连接 public SQLiteDatabase openWriteLink() { if (db == null || !db.isOpen()) { db = userDBHelper.getWritableDatabase(); } return db; } //getWritableDatabase()与getReadableDatabase() 这两个方法都可以获取到数据库的连接 //正常情况下没有区别,当手机存储空间不够了 //getReadableDatabase()就不能进行插入操作了,执行插入没有效果 //getWritableDatabase():也不能进行插入操作,如果执行插入数据的操作,则会抛异常。对于现在来说不会出现这种情况,用哪种方式都可以 //打开数据库的读连接 public SQLiteDatabase openReadLink() { if (db == null || !db.isOpen()) { db = userDBHelper.getReadableDatabase(); } return db; } //关闭数据库的读连接 public void closeLink() { if (db != null && db.isOpen()) { db.close(); db = null; } } @Override public void onCreate(SQLiteDatabase db) { //如果存在user_info表,则删除该表 String drop_sql = "DROP TABLE IF EXISTS " + TABLE_NAME + ";"; db.execSQL(drop_sql); //创建user_info表 String create_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name VARCHAR NOT NULL," + "age INTEGER NOT NULL," + "height INTEGER NOT NULL," + "weight DECIMAL(10,2) NOT NULL," + "married INTEGER NOT NULL," + "update_time VARCHAR NOT NULL" + ");"; db.execSQL(create_sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } //根据指定条件删除表记录 public int delete(String condition) { // 执行删除记录动作,该语句返回删除记录的数目 //参数一:表名 //参数二:whereClause where子句 //参数三:whereArgs 您可以在 where 子句中包含 ?s, // 它将被 whereArgs 中的值替换。这些值将绑定为字符串。 return db.delete(TABLE_NAME, condition, null); } //删除该表所有记录 public int deleteAll() { // 执行删除记录动作,该语句返回删除记录的数目 return db.delete(TABLE_NAME, "1=1", null); } // 往该表添加一条记录 public long insert(UserInfo userInfo) { List<UserInfo> infoList = new ArrayList<>(); infoList.add(userInfo); return insert(infoList); } // 往该表添加多条记录 public long insert(List<UserInfo> infoList) { long result = -1; for (int i = 0; i < infoList.size(); i++) { UserInfo userInfo = infoList.get(i); List<UserInfo> tempList = new ArrayList<>(); // 如果存在同名记录,则更新记录 // 注意条件语句的等号后面要用单引号括起来 if (userInfo.name != null && userInfo.name.length() > 0) { String condition = String.format("name='%s'", userInfo.name); tempList = query(condition); if (tempList.size() > 0) { update(userInfo, condition); result = tempList.get(0).rowid; continue; } } // 不存在唯一性重复的记录,则插入新记录 ContentValues cv = new ContentValues(); cv.put("name", userInfo.name); cv.put("age", userInfo.age); cv.put("height", userInfo.height); cv.put("weight", userInfo.weight); cv.put("married", userInfo.married); cv.put("update_time", userInfo.update_time); // 执行插入记录动作,该语句返回插入记录的行号 //参数二:参数未设置为NULL,参数提供可空列名称的名称,以便在 cv 为空的情况下显式插入 NULL。 //参数三:values 此映射包含行的初始列值。键应该是列名,值应该是列值 result = db.insert(TABLE_NAME, "", cv); // 添加成功则返回行号,添加失败则返回-1 if (result == -1) { return result; } } return result; } //根据条件更新指定的表记录 public int update(UserInfo userInfo, String condition) { ContentValues cv = new ContentValues(); cv.put("name", userInfo.name); cv.put("age", userInfo.age); cv.put("height", userInfo.height); cv.put("weight", userInfo.weight); cv.put("married", userInfo.married); cv.put("update_time", userInfo.update_time); //执行更新记录动作,该语句返回更新的记录数量 //参数二:values 从列名到新列值的映射 //参数三:whereClause 更新时要应用的可选 WHERE 子句 //参数四:whereArgs 您可以在 where 子句中包含 ?s, //它将被 whereArgs 中的值替换。这些值将绑定为字符串。 return db.update(TABLE_NAME, cv, condition, null); } public int update(UserInfo userInfo) { // 执行更新记录动作,该语句返回更新的记录数量 return update(userInfo, "rowid=" + userInfo.rowid); } public List<UserInfo> query(String condition) { String sql = String.format("select rowid,_id,name,age,height,weight,married,update_time" + " from %s where %s;", TABLE_NAME, condition); List<UserInfo> infoList = new ArrayList<>(); // 执行记录查询动作,该语句返回结果集的游标 //参数一:SQL查询 //参数二:selectionArgs //您可以在查询的 where 子句中包含 ?s,它将被 selectionArgs 中的值替换。这些值将绑定为字符串。 Cursor cursor = db.rawQuery(sql, null); // 循环取出游标指向的每条记录 while (cursor.moveToNext()) { UserInfo userInfo = new UserInfo(); //Xxx getXxx(columnIndex):根据字段下标得到对应的值 //int getColumnIndex():根据字段名得到对应的下标 //cursor.getLong():以 long 形式返回所请求列的值。 //getColumnIndex() 获取给定列名的从零开始的列索引,如果列名不存在返回-1 userInfo.name = cursor.getString(cursor.getColumnIndex("name")); userInfo.age = cursor.getInt(cursor.getColumnIndex("age")); userInfo.height = cursor.getLong(cursor.getColumnIndex("height")); userInfo.weight = cursor.getFloat(cursor.getColumnIndex("weight")); //SQLite没有布尔型,用0表示false,用1表示true userInfo.married = (cursor.getInt(cursor.getColumnIndex("married")) == 0) ? false : true; userInfo.update_time = cursor.getString(cursor.getColumnIndex("update_time")); infoList.add(userInfo); } //查询完毕,关闭数据库游标 cursor.close(); return infoList; } }
2.创建UserInfo实体类
//用户信息 public class UserInfo { public long rowid; // 行号 public int xuhao; // 序号 public String name; // 姓名 public int age; // 年龄 public long height; // 身高 public float weight; // 体重 public boolean married; // 婚否 public String update_time; // 更新时间 public UserInfo() { rowid = 0L; xuhao = 0; name = ""; age = 0; height = 0L; weight = 0.0f; married = false; update_time = ""; } }
3.创建布局页面activity_sqilte_write.xml
<?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" android:padding="5dp" tools:context=".SqilteWriteActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="姓名:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/edit_name" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="3dp" android:layout_marginBottom="3dp" android:layout_toRightOf="@+id/tv_name" android:background="@drawable/edit_style" android:gravity="center|left" android:hint="请输入姓名" android:inputType="text" android:maxLength="12" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/tv_age" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="年龄:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/edit_age" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="3dp" android:layout_marginBottom="3dp" android:layout_toRightOf="@+id/tv_age" android:background="@drawable/edit_style" android:gravity="center|left" android:hint="请输入年龄" android:inputType="number" android:maxLength="2" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/tv_height" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="身高:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/edit_height" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="3dp" android:layout_marginBottom="3dp" android:layout_toRightOf="@+id/tv_height" android:background="@drawable/edit_style" android:gravity="center|left" android:hint="请输入身高" android:inputType="number" android:maxLength="3" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/tv_weight" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="体重:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/edit_weight" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="3dp" android:layout_marginBottom="3dp" android:layout_toRightOf="@+id/tv_weight" android:background="@drawable/edit_style" android:gravity="center|left" android:hint="请输入体重" android:inputType="numberDecimal" android:maxLength="5" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp"> <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" /> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_toRightOf="@+id/checkbox" android:gravity="center" android:text="已婚" android:textColor="@color/black" android:textSize="17sp" /> </RelativeLayout> <Button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存到数据库" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>
4.创建SqilteWriteActivity类添加数据
public class SqilteWriteActivity extends AppCompatActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener { private EditText edit_name; private EditText edit_age; private EditText edit_height; private EditText edit_weight; private CheckBox checkbox; private Button btn_save; private boolean isMarried = false; //声明数据库帮助器的对象 private UserDBHelper userDBHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sqilte_write); edit_name = findViewById(R.id.edit_name); edit_age = findViewById(R.id.edit_age); edit_height = findViewById(R.id.edit_height); edit_weight = findViewById(R.id.edit_weight); checkbox = findViewById(R.id.checkbox); checkbox.setOnCheckedChangeListener(this); btn_save = findViewById(R.id.btn_save); btn_save.setOnClickListener(this); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { isMarried = isChecked; } @Override protected void onStart() { super.onStart(); userDBHelper = UserDBHelper.getInstance(this, 1); //打开数据库帮助器的写连接 userDBHelper.openWriteLink(); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_save) { String name = edit_name.getText().toString(); String age = edit_age.getText().toString(); String height = edit_height.getText().toString(); String weight = edit_weight.getText().toString(); if (TextUtils.isEmpty(name)) { ToastUtil.show(this, "请先填写姓名"); return; } else if (TextUtils.isEmpty(age)) { ToastUtil.show(this, "请先填写年龄"); return; } else if (TextUtils.isEmpty(height)) { ToastUtil.show(this, "请先填写身高"); return; } else if (TextUtils.isEmpty(weight)) { ToastUtil.show(this, "请先填写体重"); return; } UserInfo userInfo = new UserInfo(); userInfo.name = name; userInfo.age = Integer.parseInt(age); userInfo.height = Long.parseLong(height); userInfo.weight = Float.parseFloat(weight); userInfo.married = isMarried; @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String nowTime = sdf.format(new Date()); userInfo.update_time = nowTime; userDBHelper.insert(userInfo); ToastUtil.show(this, "数据已写入SQLite数据库"); } } @Override protected void onStop() { super.onStop(); userDBHelper.closeLink(); } }
以上就是添加数据的代码详解
二、读取数据库中的数据
1.布局页面activity_sqlite_read.xml
<?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=".SqliteReadActivity"> <Button android:id="@+id/btn_delete_all" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="删除所有记录" android:textColor="@color/black" android:textSize="17sp" /> <TextView android:id="@+id/tv_sqlite" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>
2.创建SqliteReadActivity类显示数据库中的数据,并且实现删除功能
public class SqliteReadActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_delete_all; private TextView tv_sqlite; //声明数据库帮助器的实例 private UserDBHelper userDBHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sqlite_read); btn_delete_all = findViewById(R.id.btn_delete_all); btn_delete_all.setOnClickListener(this); tv_sqlite = findViewById(R.id.tv_sqlite); } @Override protected void onStart() { super.onStart(); //获得数据库帮助器的实例 userDBHelper = UserDBHelper.getInstance(this, 1); //打开数据库帮助器的读连接 userDBHelper.openReadLink(); // 读取数据库中保存的所有用户记录 readSQLite(); } @SuppressLint("DefaultLocale") private void readSQLite() { if (userDBHelper == null) { ToastUtil.show(this, "数据库连接为空!"); return; } // 执行数据库帮助器的查询操作 List<UserInfo> userInfoList = userDBHelper.query("1=1"); String desc = String.format("数据库查询到%d条记录,详情如下:", userInfoList.size()); for (int i = 0; i < userInfoList.size(); i++) { UserInfo userInfo = userInfoList.get(i); desc = String.format("%s\n第%d条记录信息如下:", desc, i + 1); desc = String.format("%s\n 姓名为%s", desc, userInfo.name); desc = String.format("%s\n 年龄为%d", desc, userInfo.age); desc = String.format("%s\n 身高为%d", desc, userInfo.height); desc = String.format("%s\n 体重为%f", desc, userInfo.weight); desc = String.format("%s\n 婚否为%b", desc, userInfo.married); desc = String.format("%s\n 更新时间为%s", desc, userInfo.update_time); } if (userInfoList.size() <= 0) { desc = "数据库查询到的记录为空"; } tv_sqlite.setText(desc); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_delete_all) { //关闭数据库连接 userDBHelper.closeLink(); //打开数据库帮助器的写连接 userDBHelper.openWriteLink(); //删除所有记录 userDBHelper.deleteAll(); //关闭数据库连接 userDBHelper.closeLink(); //打开数据库帮助器的读连接 userDBHelper.openReadLink(); //读取数据库中保存的所有用户记录 readSQLite(); ToastUtil.show(this, "已删除所有记录"); } } }
以上就是显示数据库中的数据的详细步骤,和删除数据的步骤~