了解更多请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com简单使用1.创建数据库并初始化数据库publicclassHiDbHelper{//1.配置数据库相关信息privatestaticStoreConfigconfig=StoreConfig.newDefaultConfig("RdbStoreTest.db");//RdbOpenCallback用于管理数据库的创建、升级和降级不存在时会调用//2.初始化数据库表rdbStore.executeSql("CREATETABLEIFNOTEXISTEmployee(idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTNOTNULL,ageINTEGER,salaryREAL,blobTypeBLOB)");}@OverridepublicvoidonUpgrade(RdbStorerdbStore,inti,inti1){Store}是一个提供添加、删除等操作的接口、修改和查询数据库privatestaticvolatileRdbStoretore;//3.获取数据库操作对象publicstaticRdbStoresingleStore(){synchronized(HiDbHelper.class){if(store==null){synchronized(HiDbHelper.class){//DatabaseHelper提供了多种操作数据库的方式,主要是建库和删除三种类型的数据库:ORM(ObjectRelationalMapping)、RDB(RelationalDatabase)和PreferencesDatabaseHelperhelper=newDatabaseHelper(MyApplication.appContext);//通过getRdbStore获取关系数据库对象//getRdbStore的四个参数是://StoreConfigconfig:数据库的配置,包括数据库路径,存储方式,是否只读等//intversion:数据库版本,主要用到表示数据库升级或降级//RdbOpenCallbackopenCallback:用于管理数据库的创建、升级和降级//ResultSetHookresultSetHook:该类允许用户自定义结果集store=helper.getRdbStore(config,1,callback,null);}}}返回商店;}}2。插入数据关系数据库提供了插入数据的接口。通过ValuesBucket输入要存储的数据,通过返回值判断是否插入成功。//1。构造要插入的数据。在关系型数据库中,插入数据的存储形式为ValuesBucketvalues=newValuesBucket();values.putInteger("id",1);values.putString("name","zhangsan");values.putInteger("age",18);values.putDouble("salary",100.5);values.putByteArray("blobType",newbyte[]{1,2,3});//2.执行插入操作,第一个参数为需要插入数据的表名,第二个参数为要插入的数据longid=HiDbHelper.singleStore().insert("employee",values);三、查询数据查询操作关系型数据库查询提供了两种查询方法:1、通过调用ResultSetquery(AbsRdbPredicatespredicates,String[]columns)查询,该方法会自动将包含查询条件的谓词拼接成一条完整的SQL语句对于查询操作,无需调用者传入NativeSQL传入参数说明AbsRdbPredicatespredicates:谓词,可以设置查询条件。AbsRdbPredicates有两个实现类:RdbPredicates和RawRdbPredicatesRdbPredicates:支持调用predicates提供的equalTo等接口设置查询条件。RawRdbPredicates:只支持设置表名,where条件子句,whereArgs三个参数,不支持equalTo等接口调用。columns:指定查询返回的列。更多关于谓词的使用请参考官方文档关系数据库开发指南//1。需要查询的列String[]columns=newString[]{"id","name","age","salary"};//2.构造查询条件RdbPredicatesrdbPredicates=newRdbPredicates("employee").equalTo("age",23).orderByAsc("salary");//3.查询得到结果集ResultSetresultSet=HiDbHelper.singleStore().query(rdbPredicates,columns);通过调用ResultSetquerySql(Stringsql,String[]sqlArgs),使用原生SQL语句进行查询参数说明:Stringsql:用于查询的原生sql语句String[]sqlArgs:sql语句中占位参数的值,如果select语句中没有使用占位符,则该参数可以设置为null。Stringsql="selectid,name,age,salaryfromemployeewhereage=23";ResultSetresultSet=HiDbHelper.singleStore().querySql(sql,null);结果集处理调用查询方法获取ResultSet时,其默认不指向当前结果集Data,如果调用其StringgetString(intcolumnIndex)获取当前行指定索引列的值,则将抛出异常ohos.data.resultset.ResultSetIndexOutOfRangeException:checkState:rowindexisillegal。正确的操作应该是:先调用booleangoToNextRow()将结果集后移一行,返回true,表示当前位置有数据,再对结果进行处理。如果想获取更多ResultSet的使用方法,可以查看官方文档if(resultSet.goToNextRow()){HiLog.debug(TAG,"selectnameis%{public}s",resultSet.getString(1));}4.更新数据调用更新接口,传入要更新的数据,通过AbsRdbPredicates指定更新条件。该接口的返回值表示更新操作影响的行数。如果更新失败则返回0。//1。构造待更新数据的条件RdbPredicatesrdbPredicates=newRdbPredicates("employee").equalTo("id",1);//2.构造待更新数据ValuesBucketvalues=newValuesBucket();values.putString("name","Mo");//3.执行更新操作HiDbHelper.singleStore().update(values,rdbPredicates);5.调用删除接口删除数据,通过AbsRdbPredicates指定删除条件。该接口的返回值表示删除的数据行数,可以用来判断删除是否成功。如果删除失败则返回0。//1。构造需要删除数据的条件RdbPredicatesrdbPredicates=newRdbPredicates("test").equalTo("id",1);//2.执行删除操作HiDbHelper.singleStore().delete(rdbPredicates);transactional关系型数据库提供事务机制保证用户操作的原子性。对单条数据进行数据库操作时,无需开启事务;在插入大量数据时,开启事务可以保证数据的准确性。如果中途操作失败,会进行回滚操作。交易API一共有三个beginTransaction():开启交易。markAsCommit():将事务的标记设置为成功。endTransaction():结束交易。其中markAsCommit()和endTransaction()必须和beginTransaction()结合使用。如果单独调用,会抛出异常。markAsCommit()和endTransaction()不能独立调用。如果单独调用markAsCommit(),会抛出异常java.util.EmptyStackException。单独调用endTransaction()会抛出异常java.lang.IllegalStateException:Cannotdothetransactionoperation,因为没有当前事务。如果在事务块中调用了markAsCommit(),批量操作数据有错误,不会进行回滚操作。此方法在某些情况下可用于防止回滚示例代码ValuesBucketvalues=newValuesBucket();values.putInteger("id",1);values.putString("name","zhangsan");values.putInteger("age",18);values.putDouble("salary",100.5);values.putByteArray("blobType",newbyte[]{1,2,3});//开启交易HiDbHelper.singleStore().beginTransaction();//插入两个id相同的数据longid1=HiDbHelper.singleStore().insert("employee",values);longid2=HiDbHelper.singleStore().insert("employee",values);//加上下面的判断,即使id2插入不成功,也不会回滚这个事务//if(id1==1){//HiDbHelper.singleStore().markAsCommit();////结束事务HiDbHelper.singleStore().endTransacti在();除了使用beginTransaction()开启一个事务,还可以在开启一个事务的同时使用beginTransactionWithObserver(TransactionObservertransactionObserver)注册一个观察者来监控一个事务的开启、提交和回滚注意:开启一个事务后,一定要适时关闭操作,否则在执行备份数据库等操作时会抛出异常java.lang.IllegalArgumentException:Therdbisintransaction。为了代码的健壮性,可以在执行备份数据库等操作前调用RdbStore的isInTransaction判断是否有未关闭的事务。如果没有关闭,则执行关机操作。数据库升级、降级、备份、删除、恢复作为一个老手机开发者,由于最近业务繁忙,没有对这部分功能进行有效的验证。欢迎玩过的朋友进一步分享。大家也可以期待我的后续文章。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区
