Android Sqlite数据库详解
程序员文章站
2024-01-01 11:25:46
在整理ContentProvider是知识点之前要先整理Sqlite数据库的知识,因为ContentProvider中要使用到数据库。步入正题:Sqlite是起源是一艘军舰上,一个数据库程序员觉得潜艇正在使用的数据库太强大的,每次更新升级操作复杂,耗时,效率不高。然后就想优化,目标就是设计出一个简单,操作简单,独立性强的数据库,因为也是开源的,之后就在开源社区流行起来,很多开发者都开始使用sqlite数据库。定义:Sqlite是是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,是为了嵌入式系...
在整理ContentProvider知识点之前要先整理Sqlite数据库的知识,因为ContentProvider中要使用到数据库。
步入正题:Sqlite的起源是一艘军舰上,一个数据库程序员觉得潜艇正在使用的数据库太过强大,每次更新升级操作复杂,耗时,效率不高。然后就想优化,目标就是设计出一个结构功能简单,操作简单,独立性强的数据库,因为也是开源的,之后就在开源社区流行起来,很多开发者都开始使用sqlite数据库。很适合手机移动端
定义:Sqlite是是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,是为了嵌入式系统。
特点:体积小,轻量级,独立不依赖其他,简洁。效率高。
Sqlite数据库的数据类型:https://blog.csdn.net/u013360656/article/details/77963366 看到这位介绍的还不错就不做赘述了,未考证其内容,请谨慎参考。
1.Sqlite数据库的创建
继承SqliteOpenHelper 数据库助手类,重写onCreate方法,创建表的语句就写在这里
package com.zhouzhihao.test.database;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
/**
* description:
*
* @author zhouzhihao
* @time 2020/12/4 0004
*/
public class DbHelper extends SQLiteOpenHelper {
public DbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public DbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {
super(context, name, factory, version, errorHandler);
}
@RequiresApi(api = Build.VERSION_CODES.P)
public DbHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {
super(context, name, version, openParams);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql="create table user (id integer primary key autoincrement, name text(4),address text(5))";
db.execSQL(sql);
//版本4改动
String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
db.execSQL(sql1);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion){
case 2:
//版本2改动,没有break 所以版本4改动也会一层层执行
case 4:
//版本4改动
String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
db.execSQL(sql1);
}
}
}
使用数据库的类中调用,test是数据库名称,4是版本号
dBhelper=new DbHelper(this,"test",null,4);
2.增删改查
SQLiteDatabase dataBase = dBhelper.getWritableDatabase();
try {
//创建存放数据的ContentValues对象
ContentValues values = new ContentValues();
values.put("name","zhou");
//数据库执行插入命令
dataBase.insert("user", null, values);
String name="lili",address="广东省广州市";
String sql="insert into user (name,address) values ('"+name+"','"+address+"')";
dataBase.execSQL(sql);
//删除
//方式二
dataBase.delete("user", "name = ? or address = ?", new String[]{"zhouzhihao"});
String sql1="delete from user where name='lili'";
dataBase.execSQL(sql1);
//修改
ContentValues contentValues=new ContentValues();
contentValues.put("address","河南焦作");
dataBase.update("user",contentValues, "name=?",new String[]{"zhou"});
//方式二
String sql2="update user set address='广东' where name='zhou'";
dataBase.execSQL(sql2);
//查看
Cursor cursor=dataBase.rawQuery("select * from user",null);
//方式二
cursor=dataBase.query("user",new String[]{"id","name","address"},"id=?",new String[]{"11"},null,null,null,null);
ArrayList<User> dats = new ArrayList<>();
while (cursor.moveToNext()) {
User user = new User();
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name_temp = cursor.getString(cursor.getColumnIndex("name"));
String address_temp = cursor.getString(cursor.getColumnIndex("address"));
user.setId(id);
user.setName(name_temp);
user.setAddress(address_temp);
dats.add(user);
}
cursor.close();
记得cursor 调用close关闭,释放资源。
3.数据库版本更新维护
重点分析:onCreate 只在版本创建的时候调用,onUpgrade 只在数据库更新时调用,所以会有版本1升级成版本2,版本2升级成版本4,版本1升级成版本4,直接装上去就是版本4等诸多情况
我们的目的就是使所有情况在代码执行完,数据库都是完整的两张表,那么就要再onCreate和onUpgrade 存在两份相同的代码,但用户的各种情况只会执行一份。注意:switch后面的case没有break,这样才不会出现跨版本更新时,有部分代码漏掉的情况。
@Override
public void onCreate(SQLiteDatabase db) {
String sql="create table user (id integer primary key autoincrement, name text(4),address text(5))";
db.execSQL(sql);
//版本4改动
String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
db.execSQL(sql1);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion){
case 2:
//版本2改动,没有break 所以版本4改动也会一层层执行
case 4:
//版本4改动
String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
db.execSQL(sql1);
}
}
本文地址:https://blog.csdn.net/u012553125/article/details/110574498
推荐阅读
-
Android Sqlite数据库详解
-
SQL Sever2008r2 数据库服务各种无法启动问题的解决办法(详解)
-
golang常用库之操作数据库的orm框架-gorm基本使用详解
-
c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)
-
PDO连接数据库从SQLITE改为MYSQL的有关问题
-
详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
-
android要做附近商家显示,显示多少米范围内商家,php数据库如何设计坐标的
-
Android学习笔记(Android Studio) 4-2-1~2 Fragment详解(一、二)(不可不会的Activity和Fragment)
-
C#操作SQLite方法实例详解
-
PHP4 与 MySQL 数据库操作函数详解(2)_MySQL