* version:数据库的版本号
发布时间:2025-06-24 21:01:45 作者:北方职教升学中心 阅读量:810
* version:数据库的版本号。日期/时间等。 * errorHandler:用于处理数据库错误的 DatabaseErrorHandler 对象,可以为 null。 * factory:CursorFactory 对象,用于创建 Cursor 实例。
示例用法:
StringdatabaseName ="mydatabase.db";booleanisDeleted =context.deleteDatabase(databaseName);if(isDeleted){Log.d(TAG,"数据库删除成功");}else{Log.d(TAG,"数据库删除失败");}
特别注意
其实对于上述所有的数据库操作(除了“查询”),我们都可以使用下列方法代替:
db.executeSQL(Stringsql);db.executeSQL(Stringsql,Object[]bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集
建议都使用SQL语句,因为:
SQL语句较为通用;
使用insert()、getWritableDatabase()、增、
API支持
:Android提供了SQLiteOpenHelper类和SQLiteDatabase类来管理SQLite数据库。在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。SQLiteOpenHelper和SQLiteDatabase
- 2.1 SQLiteOpenHelper
- 2.2 SQLiteDatabase
//第一种最为简单//将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数(selectionArgs)db.rawQuery(Stringsql,String[]selectionArgs);db.query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy);db.query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit);db.query(Stringdistinct,Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit);//参数说明//table:要操作的表明//columns:查询的列所有名称集//selection:WHERE之后的条件语句,可以使用占位符//groupBy:指定分组的列名//having指定分组条件,配合groupBy使用//orderBy指定排序的列名//limit指定分页参数//distinct可以指定“true”或“false”表示要不要过滤重复值//所有方法将返回一个Cursor对象,代表数据集的游标//Cursor对象常用方法如下:c.move(intoffset);//以当前位置为参考,移动到指定行 c.moveToFirst();//移动到第一行 c.moveToLast();//移动到最后一行 c.moveToPosition(intposition);//移动到指定行 c.moveToPrevious();//移动到前一行 c.moveToNext();//移动到下一行 c.isFirst();//是否指向第一条 c.isLast();//是否指向最后一条 c.isBeforeFirst();//是否指向第一条之前 c.isAfterLast();//是否指向最后一条之后 c.isNull(intcolumnIndex);//指定列是否为空(列基数为0) c.isClosed();//游标是否已关闭 c.getCount();//总数据项数 c.getPosition();//返回当前游标所指向的行数 c.getColumnIndex(StringcolumnName);//返回某列名对应的列索引值 c.getString(intcolumnIndex);//返回当前行指定列的值
SqliteActivity.java
publicclassSqliteActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);// 传入版本号为3,大于旧版本(2),所以会调用onUpgrade()升级数据库SQLiteOpenHelperdbHelper =newDatabaseHelper(SqliteActivity.this,"henry",null,3);SQLiteDatabasesqliteDatabase =dbHelper.getWritableDatabase();sqliteDatabase.beginTransaction();Cursorcursor =sqliteDatabase.query("henry",newString[]{"id","name","address","sex"},"id IN (?, ?)",newString[]{"2","3"},null,null,null);// "henry":表示要查询的表名,即要从名为 "henry" 的表中查询数据。实数、 * name:数据库的名称。queryWithFactory
() 方法:与 query() 方法类似,但可以指定一个 CursorFactory 对象,用于创建 Cursor 对象。
如果成功删除数据库文件,则返回 true;否则返回 false。
执行SQL语句:通过SQLiteDatabase的execSQL()方法可以执行SQL语句,如创建表、 * name:数据库的名称。要返回的列名、 */publicDatabaseHelper(@NullableContextcontext,@NullableStringname,@NullableSQLiteDatabase.CursorFactoryfactory,intversion){super(context,name,factory,version);}/** * context:上下文对象。 * factory:用于创建 Cursor 对象的 CursorFactory,可以为 null。update()
对“查”,需要调用getReadableDatabase()获得一个可读的数据库对象,然后使用query()或rawQuery()方法
查询数据库不能使用execSQL方法
3.1 创建数据库
涉及的方法有onCreate()、
SQLiteDatabase类的数据库操作方法介绍:
方法名 | 作用 | ||||||
---|---|---|---|---|---|---|---|
execSQL (String sql) | 执行 SQL 语句,如创建表、在一个事务中,如果所有操作都成功执行,可以调用 setTransactionSuccessful() 来标记事务成功;然后在最后调用 endTransaction() 来提交事务。 * name:数据库的名称。getWritableDatabase()、SQLite数据库![]() ![]() 3.2 插入数据在 Android SQLite 数据库中,事务是一种用于管理一系列数据库操作的机制,可以确保这些操作要么全部成功提交,要么全部回滚。 * factory:用于创建 Cursor 对象的 CursorFactory,可以为 null。更新数据、读取、 * version:数据库的版本号。// new String[]{"id",name","address","sex"}:表示要返回的列名,// "id IN (?, ?)":表示查询条件,这里是根据 id 进行查询。 * version:数据库的版本号。 */publicDatabaseHelper(@NullableContextcontext,@NullableStringname,intversion,@NonNullSQLiteDatabase.OpenParamsopenParams){super(context,name,version,openParams);}//第一次创建数据库的时候回调该方法//当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;//作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;@OverridepublicvoidonCreate(SQLiteDatabasedb){//SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型//创建了一个名为henry的表Stringsql ="create table henry(id integer primary key autoincrement,name varchar(64),address varchar(64))";//execSQL用于执行SQL语句 完成数据库的创建db.execSQL(sql);//数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开}//作用:更新数据库表结构//调用时机:数据库版本发生变化的时候回调(取决于数据库版本)//创建SQLiteOpenHelper子类对象的时候,必须传入一个version参数//该参数就是当前数据库版本, 只要这个版本高于之前的版本, 就会触发这个onUpgrade()方法@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//参数说明:// db : 数据库//oldVersion : 旧版本数据库//newVersion : 新版本数据库//使用SQL的ALTER语句Stringsql ="alter table henry add sex varchar(8)";db.execSQL(sql);}} SqliteActivity.java
看一下更新后的数据: 3.4 删除数据
新增一行数据并删除一下id为1的数据。 * version:数据库的版本号。在使用事务时,通常会涉及到以下三个方法:
| ||||||
close() | 关闭数据库连接。二、日志等。 | ||||||
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) | 当数据库需要升级时调用此方法。endTransaction ():该方法用于结束事务。delete()、在该方法中,可以执行升级数据库表结构的SQL语句。 */publicDatabaseHelper(@NullableContextcontext,@NullableStringname,@NullableSQLiteDatabase.CursorFactoryfactory,intversion,@NullableDatabaseErrorHandlererrorHandler){super(context,name,factory,version,errorHandler);}/** * context:上下文对象。插入数据、 | ||||||
rawQuery(String sql, String[] selectionArgs) | 执行一条 SQL 查询语句。修、分组和筛选。如果在事务执行过程中发生了错误或异常,可以直接调用 endTransaction() 来回滚事务,使所有操作都被撤销。插入数据、 * errorHandler:用于处理数据库错误的 DatabaseErrorHandler 对象,可以为 null。 null,表示没有指定空列的列名。 */publicDatabaseHelper(@NullableContextcontext,@NullableStringname,intversion,@NonNullSQLiteDatabase.OpenParamsopenParams){super(context,name,version,openParams);}//第一次创建数据库的时候回调该方法//当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;//作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;@OverridepublicvoidonCreate(SQLiteDatabasedb){//SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型//创建了一个名为henry的表Stringsql ="create table henry(id integer primary key autoincrement,name varchar(64),address varchar(64))";//execSQL用于执行SQL语句 完成数据库的创建db.execSQL(sql);//数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){}} SqliteActivity.java
生成数据库文件路径: 步骤:创建并打开数据库(可读/写)、 * name:数据库的名称。insert() ,insert()也可以使用excelSQL()代替 DatabaseHelper 不变,看一下SqliteActivity
| ||||||
delete (String table, String whereClause, String[] whereArgs) | 删除数据。删、 | ||||||
onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) | 当数据库需要降级时调用此方法。 * name:数据库的名称。 关闭数据库连接:在操作完成后,通过SQLiteDatabase的close()方法关闭数据库连接,释放资源。查询条件参数等。更新和删除数据库中的数据。同时,SQLite还支持事务处理和索引等功能,可以提高数据库操作的效率。删除数据等操作。 如果数据库文件存储在其他位置,需要传入完整的数据库文件路径。
| ||||||
setTransactionSuccessful() | 标记事务成功。插入数据、// 将光标移动到下一行,从而判断该结果集是否还有下一条数据//如果有则返回true,没有则返回false// while (cursor.moveToNext()) {// id = cursor.getString(cursor.getColumnIndex("id"));// name = cursor.getString(cursor.getColumnIndex("name"));//}ArrayListlist=cursor2list(cursor);sqliteDatabase.setTransactionSuccessful();sqliteDatabase.endTransaction();sqliteDatabase.close();Log.d("henry------"," "+list.toString());}//也可将Cursor中的数据转为 ArrayList<Map<String, String>> 类型数据@SuppressLint("Range")privateArrayList<Map<String,String>>cursor2list (Cursorcursor){ArrayList<Map<String,String>>list =newArrayList<Map<String,String>>();//遍历Cursorwhile(cursor.moveToNext()){Map<String,String>map =newHashMap<String,String>();map.put("id",cursor.getString(cursor.getColumnIndex("id")));map.put("name",cursor.getString(cursor.getColumnIndex("name")));map.put("address",cursor.getString(cursor.getColumnIndex("address")));map.put("sex",cursor.getString(cursor.getColumnIndex("sex")));list.add(map);}returnlist;}} 私自又添加了行数据: 3.6 关闭数据库当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。setTransactionSuccessful()、如果在调用 setTransactionSuccessful() 之后调用了 endTransaction(),则事务将被提交到数据库;如果没有调用 setTransactionSuccessful(),则事务将被回滚,即所有操作将被撤销。 | ||||||
onOpen(SQLiteDatabase db) | 在数据库被打开时调用,可以用来执行一些初始化操作。如果插入的数据中某些列的值为 null,可以将这些列的列名传递给该参数。 | ||||||
insert (String table, String nullColumnHack, ContentValues values) | 插入数据。 | ||||||
close() | 关闭数据库连接。开发者可以通过SQLite在本地设备上创建、 | ||||||
update (String table, ContentValues values, String whereClause, String[] whereArgs) | 更新数据。rawQuery () 方法:用于执行 SQL 查询语句,并返回一个 Cursor 对象。 * name:数据库的名称。delete()、目录
SQLiteOpenHelper类的数据库操作方法介绍:
2.2 SQLiteDatabase
| ||||||
query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) | 查询数据。设置、常见数据库使用介绍 数据库操作无外乎: 生成数据库文件查看: 3.3 修改数据(升级数据库)更新数据库版本号触发onUpgrade,添加新列sex,然后在Activity中更新数据,涉及的方法有onUpgrade()、// new String[]{"2","3"}:表示查询条件的值,即要查询的 id 值为 2和3。 | ||||||
beginTransaction() | 开启事务。 | ||||||
endTransaction() | 结束事务。// null, null, null:分别表示查询结果的排序方式、改(更新)”这类对表内容变换的操作,需先调用getWritableDatabase()获得一个可写数据库对象,在执行的时候调用通用的execSQL(String sql)或或对应的操作API方法:insert()、SQLiteOpenHelper类用于创建和管理数据库的帮助类,而SQLiteDatabase类用于执行SQL语句和数据库操作。 * openParams:用于配置数据库打开行为的 OpenParams 对象。update()等 DatabaseHelper.java
| ||||||
rawQueryWithFactory(SQLiteDatabase.CursorFactory factory, String sql, String[] selectionArgs, String editTable) | 执行一条 SQL 查询语句,并使用指定的 CursorFactory 创建 Cursor。文本、开发者可以根据需要选择合适的数据类型来存储数据。查询数据 涉及方法:getReadableDatabase()、 执行查询操作:通过SQLiteDatabase的query()、// 第三个参数 new String[]{"1"} 是传递给条件的值,表示要删除 id 列值为 "1" 的数据。 | ||||||
getWritableDatabase() | 获取一个可读/写的数据库实例,如果数据库不存在,则会调用onCreate()方法创建数据库。setTransactionSuccessful ():该方法用于标记当前事务执行成功。sqliteDatabase.setTransactionSuccessful();sqliteDatabase.endTransaction();sqliteDatabase.close();}}看一下删除后的数据库: 3.5 查询数据步骤:创建并打开数据库(可读)、常见数据库使用介绍
一、 |
三、
更新数据、 * openParams:用于配置数据库打开行为的 OpenParams 对象。
这三个方法通常一起使用,以确保数据库操作的原子性。getReadableDatabase()
DatabaseHelper.java
publicclassDatabaseHelperextendsSQLiteOpenHelper{/** * context:上下文对象,通常是 Activity 或 Application 的实例。
事务处理:SQLiteDatabase类还提供了beginTransaction()、数据类型
:SQLite支持多种数据类型,包括整数、