ToB企服应用市场:ToB评测及商务社交产业平台

标题: 安卓数据库SQLite [打印本页]

作者: 小秦哥    时间: 2024-7-25 06:35
标题: 安卓数据库SQLite

一、SQLite数据库

SQLite是Android内置的一个小型、关系型、属于文本型的数据库,是一种轻量级的嵌入式关系型数据库管理系统,广泛应用于移动应用开辟中,包罗Android平台。
   
  
二、SQLiteOpenHelper和SQLiteDatabase

2.1 SQLiteOpenHelper


SQLiteOpenHelper类的数据库利用方法介绍:
方法名作用onCreate(SQLiteDatabase db)当数据库第一次被创建时调用此方法。在该方法中,可以实行创建数据库表的SQL语句。onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)当数据库必要升级时调用此方法。在该方法中,可以实行升级数据库表布局的SQL语句。onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)当数据库必要降级时调用此方法。在该方法中,可以实行降级数据库表布局的SQL语句。getWritableDatabase()获取一个可读/写的数据库实例,假如数据库不存在,则会调用onCreate()方法创建数据库。getReadableDatabase()获取一个可读的数据库实例,假如数据库不存在,则会调用onCreate()方法创建数据库。close()关闭数据库连接。onOpen(SQLiteDatabase db)在数据库被打开时调用,可以用来实行一些初始化利用。 2.2 SQLiteDatabase


SQLiteDatabase类的数据库利用方法介绍:
方法名作用execSQL(String sql)实行 SQL 语句,如创建表、插入数据、更新数据、删除数据等,不能举行查询利用beginTransaction()开启事件。setTransactionSuccessful()标记事件乐成。endTransaction()竣事事件。insert(String table, String nullColumnHack, ContentValues values)插入数据。update(String table, ContentValues values, String whereClause, String[] whereArgs)更新数据。delete(String table, String whereClause, String[] whereArgs)删除数据。query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)查询数据。rawQuery(String sql, String[] selectionArgs)实行一条 SQL 查询语句。rawQueryWithFactory(SQLiteDatabase.CursorFactory factory, String sql, String[] selectionArgs, String editTable)实行一条 SQL 查询语句,并使用指定的 CursorFactory 创建 Cursor。beginTransactionNonExclusive()开启非独占事件。yieldIfContendedSafely()尝试释放锁,假如有其他线程正在访问数据库,则等待一段时间再尝试。close()关闭数据库连接。
三、常见数据库使用介绍

数据库利用无外乎:“增删查改”:
对于“增、删、改(更新)”这类对表内容变换的利用,需先调用getWritableDatabase()获得一个可写数据库对象,在实行的时候调用通用的execSQL(String sql)或或对应的利用API方法:insert()、delete()、update()
对“查”,必要调用getReadableDatabase()获得一个可读的数据库对象,然后使用query()或rawQuery()方法
查询数据库不能使用execSQL方法
3.1 创建数据库

涉及的方法有onCreate()、getWritableDatabase()、getReadableDatabase()
DatabaseHelper.java
  1. public class DatabaseHelper extends SQLiteOpenHelper {
  2.     /**
  3.      * context:上下文对象,通常是 Activity 或 Application 的实例。
  4.      * name:数据库的名称。
  5.      * factory:用于创建 Cursor 对象的 CursorFactory,可以为 null。
  6.      * version:数据库的版本号。
  7.      */
  8.     public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
  9.         super(context, name, factory, version);
  10.     }
  11.     /**
  12.      * context:上下文对象。
  13.      * name:数据库的名称。
  14.      * factory:CursorFactory 对象,用于创建 Cursor 实例。
  15.      * version:数据库的版本号。
  16.      * errorHandler:用于处理数据库错误的 DatabaseErrorHandler 对象,可以为 null。
  17.      */
  18.     public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {
  19.         super(context, name, factory, version, errorHandler);
  20.     }
  21.     /**
  22.      * context:上下文对象。
  23.      * name:数据库的名称。
  24.      * version:数据库的版本号。
  25.      * openParams:用于配置数据库打开行为的 OpenParams 对象。
  26.      */
  27.     public DatabaseHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {
  28.         super(context, name, version, openParams);
  29.     }
  30.     //第一次创建数据库的时候回调该方法
  31.     //当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;
  32.     //作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;
  33.     @Override
  34.     public void onCreate(SQLiteDatabase db) {
  35.         //SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型
  36.         //创建了一个名为henry的表
  37.         String sql = "create table henry(id integer primary key autoincrement,name varchar(64),address varchar(64))";
  38.         //execSQL用于执行SQL语句 完成数据库的创建
  39.         db.execSQL(sql);
  40.         //数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开
  41.     }
  42.     @Override
  43.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  44.     }
  45. }
复制代码
SqliteActivity.java
  1. public class SqliteActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_sqlite);
  6.         // 创建DatabaseHelper对象
  7.         // 只执行这句话是不会创建或打开连接的
  8.         SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
  9.                 "henry", null, 1);
  10.         // 调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库
  11.         SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
  12.         //SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase() ;
  13.     }
  14.    
  15. }
复制代码
生成数据库文件路径:/data/data/your_package_name/databases/your_database_name.db。


3.2 插入数据

在 Android SQLite 数据库中,事件是一种用于管理一系列数据库利用的机制,可以确保这些利用要么全部乐成提交,要么全部回滚。在使用事件时,通常会涉及到以下三个方法:
   
  步骤:创建并打开数据库(可读/写)、插入数据
涉及方法:getWritableDatabase()、insert() ,insert()也可以使用excelSQL()取代
DatabaseHelper 稳定,看一下SqliteActivity
  1. public class SqliteActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_sqlite);
  6.         // 创建并打开数据库
  7.         SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
  8.                 "henry", null, 2);
  9.         SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
  10.         // 创建ContentValues对象
  11.         ContentValues values = new ContentValues();
  12.         // 向该对象中插入键值对
  13.         values.put("id", 1);
  14.         values.put("name", "henry handsome");
  15.         //其中,key代表列名,value代表该列要插入的值
  16.         //注:ContentValues内部实现就是HashMap,但是两者还是有差别的
  17.         //ContenValues Key只能是String类型,Value只能存储基本类型数据,不能存储对象
  18.         sqliteDatabase.beginTransaction();
  19.         // 调用insert()方法将数据插入到数据库当中
  20.         sqliteDatabase.insert("henry", null, values);
  21.         // 第一个参数:要操作的表名称
  22.         // 第二个参数:空列的列名:作为第二个参数传递的是空列的列名。如果插入的数据中某些列的值为 null,可以将这些列的列名传递给该参数。 null,表示没有指定空列的列名。
  23.         // 第三个参数:ContentValues对象
  24.         sqliteDatabase.setTransactionSuccessful();
  25.         sqliteDatabase.endTransaction();
  26.         db.execSQL("insert into henry (id,name) values (1,'张三')")  也可以
  27.         sqliteDatabase.close();
  28.     }
  29.    
  30. }
复制代码
生成数据库文件查看:

3.3 修改数据(升级数据库)

更新数据库版本号触发onUpgrade,添加新列sex,然后在Activity中更新数据,涉及的方法有onUpgrade()、getWritableDatabase()、update()等
DatabaseHelper.java
  1. public class DatabaseHelper extends SQLiteOpenHelper {
  2.     /**
  3.      * context:上下文对象,通常是 Activity 或 Application 的实例。
  4.      * name:数据库的名称。
  5.      * factory:用于创建 Cursor 对象的 CursorFactory,可以为 null。
  6.      * version:数据库的版本号。
  7.      */
  8.     public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
  9.         super(context, name, factory, version);
  10.     }
  11.     /**
  12.      * context:上下文对象。
  13.      * name:数据库的名称。
  14.      * factory:CursorFactory 对象,用于创建 Cursor 实例。
  15.      * version:数据库的版本号。
  16.      * errorHandler:用于处理数据库错误的 DatabaseErrorHandler 对象,可以为 null。
  17.      */
  18.     public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {
  19.         super(context, name, factory, version, errorHandler);
  20.     }
  21.     /**
  22.      * context:上下文对象。
  23.      * name:数据库的名称。
  24.      * version:数据库的版本号。
  25.      * openParams:用于配置数据库打开行为的 OpenParams 对象。
  26.      */
  27.     public DatabaseHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {
  28.         super(context, name, version, openParams);
  29.     }
  30.     //第一次创建数据库的时候回调该方法
  31.     //当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;
  32.     //作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;
  33.     @Override
  34.     public void onCreate(SQLiteDatabase db) {
  35.         //SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型
  36.         //创建了一个名为henry的表
  37.         String sql = "create table henry(id integer primary key autoincrement,name varchar(64),address varchar(64))";
  38.         //execSQL用于执行SQL语句 完成数据库的创建
  39.         db.execSQL(sql);
  40.         //数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开
  41.     }
  42.     //作用:更新数据库表结构
  43.     //调用时机:数据库版本发生变化的时候回调(取决于数据库版本)
  44.     //创建SQLiteOpenHelper子类对象的时候,必须传入一个version参数
  45.     //该参数就是当前数据库版本, 只要这个版本高于之前的版本, 就会触发这个onUpgrade()方法
  46.     @Override
  47.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  48.         //参数说明:
  49.         // db : 数据库
  50.         //oldVersion : 旧版本数据库
  51.         //newVersion : 新版本数据库
  52.         //使用SQL的ALTER语句
  53.         String sql = "alter table henry add sex varchar(8)";
  54.         db.execSQL(sql);
  55.     }
  56. }
复制代码
SqliteActivity.java
  1. public class SqliteActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_sqlite);
  6.         // 传入版本号为3,大于旧版本(2),所以会调用onUpgrade()升级数据库
  7.         SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
  8.                 "henry", null, 3);
  9.         SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
  10.         // 创建一个ContentValues对象
  11.         ContentValues value = new ContentValues();
  12.         value.put("sex", "man");
  13.         sqliteDatabase.beginTransaction();
  14.         // 调用update方法修改数据库
  15.         sqliteDatabase.update("henry", value, "id=?", new String[] { "1" });
  16.         // 第一个参数String:表名
  17.         // 第二个参数ContentValues:ContentValues对象(需要修改的)
  18.         // 第三个参数String:WHERE表达式,where选择语句, 选择那些行进行数据的更新, 如果该参数为 null, 就会修改所有行;?号是占位符
  19.         // 第四个参数String[]:where选择语句的参数, 逐个替换 whereClause 中的占位符;
  20.         sqliteDatabase.setTransactionSuccessful();
  21.         sqliteDatabase.endTransaction();
  22.         sqliteDatabase.close();
  23.     }
  24. }
复制代码
看一下更新后的数据:

3.4 删除数据

   delete 删除的是整行而不是整列
  新增一行数据并删除一下id为1的数据。
步骤:创建并打开数据库(可读/写)、删除数据
涉及到的方法:getWritableDatabase()、delete() ,delete()也可以使用excelSQL()取代
SqliteActivity.java
  1. public class SqliteActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_sqlite);
  6.         // 传入版本号为3,大于旧版本(2),所以会调用onUpgrade()升级数据库
  7.         SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
  8.                 "henry", null, 3);
  9.         ContentValues values = new ContentValues();
  10.         values.put("id", 2);
  11.         values.put("name", "henry handsome2");
  12.         values.put("address", "china");
  13.         values.put("sex", "man");
  14.         SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
  15.         sqliteDatabase.beginTransaction();
  16.         sqliteDatabase.insert("henry", null, values);
  17.         //调用delete方法进行删除操作
  18.         sqliteDatabase.delete("henry", "id=?", new String[]{"1"});
  19. //        sqliteDatabase.execSQL("DELETE FROM henry WHERE id = 1");
  20. //        第一个参数 "henry" 是要删除数据的表名。
  21. //        第二个参数 "id=?" 是删除数据的条件,其中 "?" 是一个占位符,用于接收条件值。
  22. //        第三个参数 new String[]{"1"} 是传递给条件的值,表示要删除 id 列值为 "1" 的数据。
  23.         sqliteDatabase.setTransactionSuccessful();
  24.         sqliteDatabase.endTransaction();
  25.         sqliteDatabase.close();
  26.     }
  27. }
复制代码
看一下删除后的数据库:

3.5 查询数据

步骤:创建并打开数据库(可读)、查询数据
涉及方法:getReadableDatabase()、query() 或 rawQuery()
   
  1. //第一种最为简单
  2. //将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数(selectionArgs)
  3. db.rawQuery(String sql, String[] selectionArgs);  
  4. db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);  
  5. db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  
  6. db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  
  7. //参数说明
  8. //table:要操作的表明
  9. //columns:查询的列所有名称集
  10. //selection:WHERE之后的条件语句,可以使用占位符
  11. //groupBy:指定分组的列名
  12. //having指定分组条件,配合groupBy使用
  13. //orderBy指定排序的列名
  14. //limit指定分页参数
  15. //distinct可以指定“true”或“false”表示要不要过滤重复值
  16. //所有方法将返回一个Cursor对象,代表数据集的游标
  17. //Cursor对象常用方法如下:
  18. c.move(int offset); //以当前位置为参考,移动到指定行  
  19. c.moveToFirst();    //移动到第一行  
  20. c.moveToLast();     //移动到最后一行  
  21. c.moveToPosition(int position); //移动到指定行  
  22. c.moveToPrevious(); //移动到前一行  
  23. c.moveToNext();     //移动到下一行  
  24. c.isFirst();        //是否指向第一条  
  25. c.isLast();     //是否指向最后一条  
  26. c.isBeforeFirst();  //是否指向第一条之前  
  27. c.isAfterLast();    //是否指向最后一条之后  
  28. c.isNull(int columnIndex);  //指定列是否为空(列基数为0)  
  29. c.isClosed();       //游标是否已关闭  
  30. c.getCount();       //总数据项数  
  31. c.getPosition();    //返回当前游标所指向的行数  
  32. c.getColumnIndex(String columnName);//返回某列名对应的列索引值  
  33. c.getString(int columnIndex);   //返回当前行指定列的值  
复制代码
SqliteActivity.java
  1. public class SqliteActivity extends AppCompatActivity {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_sqlite);
  6.         // 传入版本号为3,大于旧版本(2),所以会调用onUpgrade()升级数据库
  7.         SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
  8.                 "henry", null, 3);
  9.         SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
  10.         sqliteDatabase.beginTransaction();
  11.         Cursor cursor = sqliteDatabase.query("henry", new String[]{"id",
  12.                 "name","address","sex"}, "id IN (?, ?)", new String[]{"2","3"}, null, null, null);
  13. //        "henry":表示要查询的表名,即要从名为 "henry" 的表中查询数据。
  14. //        new String[]{"id",name","address","sex"}:表示要返回的列名,
  15. //        "id IN (?, ?)":表示查询条件,这里是根据 id 进行查询。
  16. //        new String[]{"2","3"}:表示查询条件的值,即要查询的 id 值为 2和3。
  17. //        null, null, null:分别表示查询结果的排序方式、分组方式和筛选方式,这里都设置为 null,表示不进行排序、分组和筛选。
  18.         // 将光标移动到下一行,从而判断该结果集是否还有下一条数据
  19.         //如果有则返回true,没有则返回false
  20. //        while (cursor.moveToNext()) {
  21. //            id = cursor.getString(cursor.getColumnIndex("id"));
  22. //            name = cursor.getString(cursor.getColumnIndex("name"));
  23. //        }
  24.         ArrayList list=cursor2list(cursor);
  25.         sqliteDatabase.setTransactionSuccessful();
  26.         sqliteDatabase.endTransaction();
  27.         sqliteDatabase.close();
  28.         Log.d("henry------"," "+list.toString());
  29.     }
  30.     //也可将Cursor中的数据转为 ArrayList<Map<String, String>> 类型数据
  31.     @SuppressLint("Range")
  32.     private ArrayList<Map<String, String>> cursor2list (Cursor cursor){
  33.         ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
  34.         //遍历Cursor
  35.         while (cursor.moveToNext()) {
  36.             Map<String, String> map = new HashMap<String, String>();
  37.             map.put("id", cursor.getString(cursor.getColumnIndex("id")));
  38.             map.put("name", cursor.getString(cursor.getColumnIndex("name")));
  39.             map.put("address", cursor.getString(cursor.getColumnIndex("address")));
  40.             map.put("sex", cursor.getString(cursor.getColumnIndex("sex")));
  41.             list.add(map);
  42.         }
  43.         return list;
  44.     }
  45. }
复制代码
私自又添加了行数据:


3.6 关闭数据库

当我们完成了对数据库的利用后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。
  1.         SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
  2.                 "henry", null, 3);
  3.          // 调用getReadableDatabase()方法创建或打开一个可以读的数据库
  4.          //通过返回的SQLiteDatabase对象对数据库进行操作
  5.         SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
  6.                 //关闭当前数据库  
  7.         sqliteDatabase.close();  
复制代码
3.7 删除数据库

想要删除数据库时,使用如下:
  1.         SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
  2.                 "henry", null, 3);
  3.         SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
  4.         deleteDatabase("henry");
复制代码
诺,数据库文件没有了

deleteDatabase() 是 Context 类中的一个方法,用于删除应用程序的数据库。该方法的参数详解如下:
   
  1. String databaseName = "mydatabase.db";
  2. boolean isDeleted = context.deleteDatabase(databaseName);
  3. if (isDeleted) {
  4.     Log.d(TAG, "数据库删除成功");
  5. } else {
  6.     Log.d(TAG, "数据库删除失败");
  7. }
复制代码
特别留意
其实对于上述全部的数据库利用(除了“查询”),我们都可以使用下列方法取代:
  1. db.executeSQL(String sql);  
  2. db.executeSQL(String sql, Object[] bindArgs);
  3. //sql语句中使用占位符,然后第二个参数是实际的参数集
复制代码
发起都使用SQL语句,由于:
SQL语句较为通用;
使用insert()、delete()、query()方法具备多个参数,使用复杂。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4