赞
踩
新手最近刚开始学鸿蒙开发,到数据库这里也查了挺多资料的,查完也挺恼火的,五六个内容基本完全相同的文章作者都加了自己原创然后一贴,细节也什么都不说,这里我今天搞懂了一些,希望对像我这样的初学者有一些帮助,少走一些弯路。
package com.example.rdbdatabase; import com.example.rdbdatabase.slice.MainAbilitySlice; import ohos.aafwk.ability.Ability; import ohos.aafwk.content.Intent; import ohos.data.DatabaseHelper; import ohos.data.distributed.common.Query; import ohos.data.rdb.*; import ohos.data.resultset.ResultSet; import javax.security.auth.callback.CallbackHandler; import java.util.function.Predicate; public class MainAbility extends Ability { RdbOpenCallback callback = new RdbOpenCallback() { @Override public void onCreate(RdbStore rdbStore) { rdbStore.executeSql("CREATE TABLE IF NOT EXISTS rdbdemo "+ "(ID INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER NOT NULL)"); } @Override public void onUpgrade(RdbStore rdbStore, int i, int i1) { } }; @Override public void onStart(Intent intent) { super.onStart(intent); super.setMainRoute(MainAbilitySlice.class.getName()); StoreConfig config = StoreConfig.newDefaultConfig("demo.db"); //配置数据库信息,该处采用默认。 DatabaseHelper helper = new DatabaseHelper(this); //我理解是一个生成操作数据库的对象,核心 //通过helper对象找到数据库,若没有则创建,在创建数据库时回调 用于数据库中表的初始化 RdbStore rdbStore = helper.getRdbStore(config, 1, callback, null); //插入数据 this.rdb_insert(1,"zhang_san",20,rdbStore); this.rdb_insert(3,"li_si",27,rdbStore); this.rdb_insert(7,"wang_wu",33,rdbStore); //查询数据 //两种方式,接口提供了使用原始的sql语句以及通过”谓词“的方式 //原始sql语句 System.out.println("下面通过原始sql语句的方式"); ResultSet resultSet = rdbStore.querySql("select id,name from rdbdemo where age>? order by ID desc", new String[]{"25"}); if(resultSet ==null)System.out.println("failed to query!"); for(int i=0;i<resultSet.getRowCount();i++){ resultSet.goToRow(i); System.out.println(" == ID = "+resultSet.getInt(resultSet.getColumnIndexForName("ID")) +"name = "+resultSet.getString(resultSet.getColumnIndexForName("name"))+" == "); } //谓词的方式 System.out.println("下面通过谓词的方式"); RdbPredicates rdbPredicates = new RdbPredicates("rdbdemo").greaterThan("age", 25).orderByDesc("ID"); String[] columns = new String[]{"ID","name"}; ResultSet resultSet1 = rdbStore.query(rdbPredicates,columns); for(int i=0;i<resultSet1.getRowCount();i++){ resultSet1.goToRow(i); System.out.println(" == ID = "+resultSet1.getInt(resultSet1.getColumnIndexForName("ID")) +" name = "+resultSet1.getString(resultSet1.getColumnIndexForName("name"))+" == "); } } public long rdb_insert(int id,String name,int age,RdbStore rdbStore){ ValuesBucket valuesBucket = new ValuesBucket(); valuesBucket.putInteger("ID",id); valuesBucket.putString("name",name); valuesBucket.putInteger("age",age); return rdbStore.insert("rdbdemo",valuesBucket); } }
运行结果如下:
说句实话,昨天在CSDN上看到的几篇重复文章都是只讲的这里还有问题,所以我把我遇到的问题详细解决一下,供大家参考
这里用到了注解处理器。
这里不多赘述,直接上链接
java注解和注解处理器使用
鸿蒙开发工具也支持注解
但是需要提前配置,其他文章都是单纯告诉参数应该怎么写,并没有教配置,让新手很困惑,这里我给大家说一下
要在本模块(即entry)模块下的build,gradle配置文件中配置参数打开注解处理器
即下面这段参数
compileOptions{
annotationEnabled true
}
添加在如下位置
ohos { compileSdkVersion 6 defaultConfig { compatibleSdkVersion 6 } compileOptions{ annotationEnabled true } buildTypes { release { proguardOpt { proguardEnabled false rulesFiles 'proguard-rules.pro' } } } }
随后这里许多文章没有提供。
为了可以识别注解还需要添加相关的架包的依赖
也是在该文档中
dependencies {
compile files("ohos.jar的路径","orm_annotations_java.jar路径",
"orm_annotations_processor_java.jar路径","javapoet_java.jar路径")
annotationProcessor files("orm_annotations_java.jar路径",
"orm_annotations_processor_java.jar路径","javapoet_java.jar路径")
}
将上面这段配置添加到下面的位置
其中路径需要自己替换一下
这些依赖都在DevEco安装目录下的SDK的java目录下的位置,可以通过搜索找到
ohos { compileSdkVersion 6 defaultConfig { compatibleSdkVersion 6 } compileOptions{ annotationEnabled true } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) testImplementation 'junit:junit:4.13' ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.200' compile files("ohos.jar的路径","orm_annotations_java.jar路径", "orm_annotations_processor_java.jar路径","javapoet_java.jar路径") annotationProcessor files("orm_annotations_java.jar路径", "orm_annotations_processor_java.jar路径","javapoet_java.jar路径") }
对象映射数据库的数据库和表的设计如下
//数据库
package com.example.ormdatabase.db;
import com.example.ormdatabase.db.table.User;
import ohos.data.orm.OrmDatabase;
import ohos.data.orm.annotation.Database;
@Database(entities = {User.class},version = 1)
public abstract class User_db extends OrmDatabase {
}
表
package com.example.ormdatabase.db.table; import ohos.data.orm.OrmObject; import ohos.data.orm.annotation.Entity; import ohos.data.orm.annotation.Index; import ohos.data.orm.annotation.PrimaryKey; @Entity(tableName = "user") //这里也可以添加索引,这里我简单处理 public class User extends OrmObject { @PrimaryKey //将ID设置为主键 private Integer ID; private String name; private Integer age; public Integer getID() { return ID; } public void setID(Integer ID) { this.ID = ID; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
开发者可通过创建一个继承了OrmObject并用@Entity注解的类,获取数据库实体对象,也就是表的对象。数据表必须与其所在的数据库在同一个模块中。
注解对照表
接口名称 | 描述 |
---|---|
@Database | 被@Database注解且继承了OrmDatabase的类对应数据库类。 |
@Entity | 被@Entity注解且继承了OrmObject的类对应数据表类 |
@Column | 被@Column注解的变量对应数据表的字段。 |
@PrimaryKey | 被@PrimaryKey注解的变量对应数据表的主键。 |
@ForeignKey | 被@ForeignKey注解的变量对应数据表的外键。 |
@Index | 被@Index注解的内容对应数据表索引的属性。 |
package com.example.ormdatabase.slice; import com.example.ormdatabase.ResourceTable; import com.example.ormdatabase.db.User_db; import com.example.ormdatabase.db.table.User; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; import ohos.data.DatabaseHelper; import ohos.data.distributed.common.Query; import ohos.data.orm.OrmContext; import ohos.data.orm.OrmPredicates; import java.util.List; import java.util.function.Predicate; public class MainAbilitySlice extends AbilitySlice { @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); //ormContext为对象数据库的操作接口,之后的增删等操作都是通过该对象进行操作 DatabaseHelper helper = new DatabaseHelper(this); OrmContext ormContext = helper.getOrmContext("User_db", "Userdemo.db", User_db.class); this.my_insert(1,"zhang_san",24,ormContext); this.my_insert(2,"li_si",27,ormContext); this.my_insert(3,"wang_wu",37,ormContext); OrmPredicates ormPredicates = ormContext.where(User.class).greaterThan("age", 25).orderByDesc("id"); List<User> users = ormContext.query(ormPredicates); for(int i=0;i<users.size();i++){ User user = users.get(i); System.out.println("== ID= "+user.getID()+" name= "+user.getName()); } } public void my_insert(int ID,String name,int age,OrmContext ormContext){ User user = new User(); user.setID(ID); user.setName(name); user.setAge(age); ormContext.insert(user); //插入内存 ormContext.flush(); //持久化到数据库 } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } }
日志中的运行结果如下
组件那些我也会逐渐学精然后进行整理。
最近在学习dataability以及分布式数据库,过段时间也会写demo发布的。
如果内容有错的地方希望可以指正,谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。