HarmonyOS 鸿蒙Next 用ArkUI开发的项目,在读取SQLite数据库数据读取不到,有大佬帮忙看看吗
HarmonyOS 鸿蒙Next 用ArkUI开发的项目,在读取SQLite数据库数据读取不到,有大佬帮忙看看吗
todo.hml
<div class="text-box">
<list class="list">
<list-item type="listItem" class="todo-item" for="{{ todoList }}">
<div class="div-item" @click="onClick($item)" @longpress="onWantDeleted($idx)">
<text if="{{!$item.done}}" class="title-text">{{ $item.title }}</text>
<text if="{{ $item.done }}" class="checked-title">{{ $item.title }}</text>
<text if="{{!$item.done}}" class="date-text"> {{$item.deadline}} </text>
<text if="{{ $item.done }}" class="date-text"> {{$item.deadline}} </text>
<div if="{{!$item.done}}" class="unchecked-radio" @click="doneTodo($item)"></div>
<div if="{{ $item.done }}" class="checked-radio" @click="doneTodo($item)"></div>
</div>
</list-item>
</list>
</div>
JS代码
todo.js
import router from '@system.router';
export default {
data: {
todoList: [],
selectedIndex: -1,
number: 0
},
onInit() {
this.rerender();
},
//单击事项,进入详情页
onClick(todo) {
router.push({
uri: "pages/todo_detail/detail",
params: {
todo
}
});
},
//创建事项页面跳转
goToCreate() {
router.push({
uri: "pages/todo_create/create"
})
},
//长按选中的待办事项,弹出编辑和删除操作
onWantDeleted(idx) {
this.selectedIndex = idx;
this.$element("apiMenu").show({
x: 360,
y: 100 + idx * 36
});
},
onShow() {
this.refresh();
},
onMenuSelected: async function(e) {
switch (e.value) {
case 'edit':
router.push({
uri: 'pages/todo_edit/edit',
params: {
todo: this.todoList[this.selectedIndex]
}
})
break;
case 'delete':
await this.$app.$def.deleteTodo(this.todoList[this.selectedIndex])
this.refresh();
break;
}
},
rerender() {
//获取整个待办列表项
this.todoList = this.$app.$def.data.todoList.sort((a, b) => a.id - b.id);
//获取待办项的数量
this.number = this.todoList.length.toString() + this.$t('strings.number');
},
doneTodo(todo) {
todo.done = !todo.done;
this.$app.$def.updateTodo(todo)
this.rerender();
},
refresh: async function() {
await this.$app.$def.refresh();
this.rerender();
}
}
app.js
import prompt from '@system.prompt'
export default {
data: {
todoList: []
},
onCreate() {
console.info('AceApplication onCreate');
},
onDestroy() {
console.info('AceApplication onDestroy');
},
refresh: async function() {
var action = {
bundleName: 'com.lfbysj.hm_pkm',
abilityName: '.DataBridgeAbility',
messageCode: 1001,
abilityType: 0
};
var result = await FeatureAbility.callAbility(action);
var todos = JSON.parse(result)
this.data.todoList = todos;
},
updateOrCreateTodo: async function(todo) {
var action = {
bundleName: 'com.lfbysj.hm_pkm',
abilityName: '.DataBridgeAbility',
messageCode: 1002,
data: todo,
abilityType: 0
};
var result = await FeatureAbility.callAbility(action);
var todos = JSON.parse(result)
this.data.todoList = todos;
},
deleteTodo: async function(todo) {
var action = {
bundleName: 'com.lfbysj.hm_pkm',
abilityName: '.DataBridgeAbility',
messageCode: 1003,
data: todo,
abilityType: 0
};
var result = await FeatureAbility.callAbility(action);
var todos = JSON.parse(result)
this.data.todoList = todos;
},
};
dataability部分
创建实例化Todo类
package com.lfbysj.hm_pkm.model;
public class Todo {
public int id;
public String title;
public String description;
public String deadline;
public boolean done;
public Todo(int id, String title, String description, String deadline, boolean done) {
this.id = id;
this.title = title;
this.description = description;
this.deadline = deadline;
this.done = done;
}
}
DataBridgeAbility
package com.lfbysj.hm_pkm;
import com.lfbysj.hm_pkm.model.Todo;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.ability.DataAbilityHelper;
import ohos.aafwk.ability.DataAbilityRemoteException;
import ohos.aafwk.content.Intent;
import ohos.data.dataability.DataAbilityPredicates;
import ohos.data.resultset.ResultSet;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.rpc.*;
import ohos.utils.net.Uri;
import ohos.utils.zson.ZSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataBridgeAbility extends Ability {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");
private static final int GET_ALL_TODO = 1001;
private static final int UPDATE_TODO = 1002;
private static final int DELETE_TODO = 1003;
private static final String BASE_URI = "dataability:///com.lfbysj.hm_pkm.TodoDataAbility";
private static final String DATA_PATH = "/todo";
private static final String DB_COLUMN_TODO_ID = "id";
private static final String DB_COLUMN_TITLE = "title";
private static final String DB_COLUMN_DESCRIPTION = "description";
private static final String DB_COLUMN_DEADLINE = "deadline";
private static final String DB_COLUMN_DONE = "done";
private final String[] columns = new String[]{DB_COLUMN_TODO_ID, DB_COLUMN_TITLE, DB_COLUMN_DESCRIPTION, DB_COLUMN_DEADLINE, DB_COLUMN_DONE};
private final MyRemote remote = new MyRemote();
private DataAbilityHelper databaseHelper;
@Override
public void onStart(Intent intent) {
HiLog.error(LABEL_LOG, "DataBridgeAbility::onStart");
super.onStart(intent);
this.databaseHelper = DataAbilityHelper.creator(this);
try {
insert(1, "买菜", "买煮晚餐要用的食材", "2021-08-01", false);
insert(2, "洗衣服", "把衣服拿去洗", "2021-09-01", false);
} catch (DataAbilityRemoteException e) {
e.printStackTrace();
}
}
@Override
public void onBackground() {
super.onBackground();
HiLog.info(LABEL_LOG, "DataBridgeAbility::onBackground");
}
@Override
public void onStop() {
super.onStop();
HiLog.info(LABEL_LOG, "DataBridgeAbility::onStop");
}
@Override
public void onCommand(Intent intent, boolean restart, int startId) {
}
@Override
public IRemoteObject onConnect(Intent intent) {
super.onConnect(intent);
return remote.asObject();
}
@Override
public void onDisconnect(Intent intent) {
}
private List<Todo> queryAllTodos() throws DataAbilityRemoteException {
DataAbilityPredicates predicates = new DataAbilityPredicates();
ResultSet resultSet = databaseHelper.query(Uri.parse(BASE_URI + DATA_PATH), columns, predicates);
if (resultSet == null || resultSet.getRowCount() == 0) {
return new ArrayList<>();
}
resultSet.goToFirstRow();
List<Todo> results = new ArrayList<>();
do {
int id = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_TODO_ID));
String title = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_TITLE));
String description = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_DESCRIPTION));
String deadline = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_DEADLINE));
int done = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_DONE));
results.add(new Todo(id, title, description, deadline, done != 0));
} while (resultSet.goToNextRow());
return results;
}
private void insert(int id, String title, String description, String deadline, boolean done) throws DataAbilityRemoteException {
ValuesBucket valuesBucket = new ValuesBucket();
valuesBucket.putInteger(DB_COLUMN_TODO_ID, id);
valuesBucket.putString(DB_COLUMN_TITLE, title);
valuesBucket.putString(DB_COLUMN_DESCRIPTION, description);
valuesBucket.putString(DB_COLUMN_DEADLINE, deadline);
valuesBucket.putBoolean(DB_COLUMN_DONE, done);
databaseHelper.insert(Uri.parse(BASE_URI + DATA_PATH), valuesBucket);
}
private void deleteTodo(int id) throws DataAbilityRemoteException {
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.equalTo("id", id);
databaseHelper.delete(Uri.parse(BASE_URI + DATA_PATH), predicates);
}
class MyRemote extends RemoteObject implements IRemoteBroker {
MyRemote() {
super("MyService_MyRemote");
}
@Override
public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
switch (code) {
case GET_ALL_TODO: {
try {
List<Todo> r = queryAllTodos();
reply.writeString(ZSONObject.toZSONString(r));
return true;
} catch (DataAbilityRemoteException e) {
e.printStackTrace();
}
}
case UPDATE_TODO: {
try {
ZSONObject todo = ZSONObject.stringToZSON(data.readString());
int id = todo.getInteger("id");
String title = todo.getString("title");
String description = todo.getString("description");
String deadline = todo.getString("deadline");
boolean done = todo.getBoolean("done");
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.equalTo("id", id);
ResultSet resultSet = null;
resultSet = databaseHelper.query(Uri.parse(BASE_URI + DATA_PATH), columns, predicates);
if (resultSet == null || resultSet.getRowCount() == 0) {
try {
insert(id, title, description, deadline, done);
List<Todo> r = queryAllTodos();
reply.writeString(ZSONObject.toZSONString(r));
return true;
} catch (DataAbilityRemoteException e) {
e.printStackTrace();
}
}
ValuesBucket valuesBucket = new ValuesBucket();
valuesBucket.putString("title", title);
valuesBucket.putString("description", description);
valuesBucket.putString("deadline", deadline);
valuesBucket.putBoolean("done", done);
databaseHelper.update(Uri.parse(BASE_URI + DATA_PATH), valuesBucket, predicates);
List<Todo> r = queryAllTodos();
reply.writeString(ZSONObject.toZSONString(r));
return true;
} catch (DataAbilityRemoteException e) {
e.printStackTrace();
return false;
}
}
case DELETE_TODO: {
try {
ZSONObject todo = ZSONObject.stringToZSON(data.readString());
int id = todo.getInteger("id");
deleteTodo(id);
return true;
} catch (DataAbilityRemoteException e) {
e.printStackTrace();
}
}
default: {
Map<String, Object> result = new HashMap<>(5);
result.put("code", 500);
result.put("msg", "invalid code");
reply.writeString(ZSONObject.toZSONString(result));
return false;
}
}
}
@Override
public IRemoteObject asObject() {
return this;
}
}
}
TodoDataAbility
package com.lfbysj.hm_pkm;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.ability.DataAbilityHelper;
import ohos.aafwk.content.Intent;
import ohos.data.DatabaseHelper;
import ohos.data.dataability.DataAbilityPredicates;
import ohos.data.dataability.DataAbilityUtils;
import ohos.data.rdb.*;
import ohos.data.resultset.ResultSet;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.utils.PacMap;
import ohos.utils.net.Uri;
import java.io.FileDescriptor;
public class TodoDataAbility extends Ability {
private static final String DB_NAME = "tododataability.db";
private static final String DB_TAB_NAME = "todo";
private static final String DB_COLUMN_TODO_ID = "id";
private static final String DB_COLUMN_TITLE = "title";
private static final String DB_COLUMN_DESCRIPTION = "description";
private static final String DB_COLUMN_DEADLINE = "deadline";
private static final String DB_COLUMN_DONE = "done";
private static final int DB_VERSION = 1;
private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");
//对象关联
private final StoreConfig config = StoreConfig.newDefaultConfig(DB_NAME);
private final RdbOpenCallback rdbOpenCallback = new RdbOpenCallback() {
@Override
public void onCreate(RdbStore store) {
store.executeSql("create table if not exists "
+ DB_TAB_NAME + " ("
+ DB_COLUMN_TODO_ID + " integer primary key, "
+ DB_COLUMN_TITLE + " text not null, "
+ DB_COLUMN_DESCRIPTION + " text not null, "
+ DB_COLUMN_DEADLINE + " text not null, "
+ DB_COLUMN_DONE + " bool not null)");
}
@Override
public void onUpgrade(RdbStore store, int oldVersion, int newVersion) {
}
};
private RdbStore rdbStore;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
HiLog.info(LABEL_LOG, "PersonDataAbility onStart");
DatabaseHelper databaseHelper = new DatabaseHelper(this);
rdbStore = databaseHelper.getRdbStore(config, DB_VERSION, rdbOpenCallback, null);
}
@Override
public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);
ResultSet resultSet = rdbStore.query(rdbPredicates, columns);
if (resultSet == null) {
HiLog.info(LABEL_LOG, "resultSet is null");
}
return resultSet;
}
@Override
public int insert(Uri uri, ValuesBucket value) {
ValuesBucket values = new ValuesBucket();
values.putInteger(DB_COLUMN_TODO_ID, value.getInteger(DB_COLUMN_TODO_ID));
values.putString(DB_COLUMN_TITLE, value.getString(DB_COLUMN_TITLE));
values.putString(DB_COLUMN_DESCRIPTION, value.getString(DB_COLUMN_DESCRIPTION));
values.putString(DB_COLUMN_DEADLINE, value.getString(DB_COLUMN_DEADLINE));
values.putBoolean(DB_COLUMN_DONE, value.getBoolean(DB_COLUMN_DONE));
int index = (int) rdbStore.insert(DB_TAB_NAME, values);
DataAbilityHelper.creator(this, uri).notifyChange(uri);
return index;
}
@Override
public int delete(Uri uri, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);
int index = rdbStore.delete(rdbPredicates);
HiLog.info(LABEL_LOG, "delete: " + index);
DataAbilityHelper.creator(this, uri).notifyChange(uri);
return index;
}
@Override
public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, DB_TAB_NAME);
int index = rdbStore.update(value, rdbPredicates);
HiLog.info(LABEL_LOG, "update: " + index);
DataAbilityHelper.creator(this, uri).notifyChange(uri);
return index;
}
@Override
public FileDescriptor openFile(Uri uri, String mode) {
return null;
}
@Override
public String[] getFileTypes(Uri uri, String mimeTypeFilter) {
return new String[0];
}
@Override
public PacMap call(String method, String arg, PacMap extras) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
}
更多关于HarmonyOS 鸿蒙Next 用ArkUI开发的项目,在读取SQLite数据库数据读取不到,有大佬帮忙看看吗的实战教程也可以访问 https://www.itying.com/category-93-b0.html
楼主你好,数据库开发建议不要java与ets混合使用,请参考:https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-data-storage-0000001117163542
更多关于HarmonyOS 鸿蒙Next 用ArkUI开发的项目,在读取SQLite数据库数据读取不到,有大佬帮忙看看吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
好的,谢谢您。我仿着别人写的,我看他的能正常,我的不大行。
欢迎开发小伙伴们进来帮帮楼主
在HarmonyOS鸿蒙Next使用ArkUI开发时,如果遇到SQLite数据库数据读取不到的问题,可能是以下几个原因:
-
数据库文件路径问题:确保数据库文件的路径正确无误,并且应用具有对该路径的读写权限。路径错误或权限不足都会导致无法访问数据库文件。
-
数据库连接问题:检查数据库连接是否成功建立。如果连接失败,后续的读取操作自然无法进行。
-
SQL查询语句问题:验证SQL查询语句是否正确。错误的查询语句或语法错误都会导致无法正确读取数据。
-
事务处理:如果涉及到事务处理,确保事务正确提交或回滚。未提交的事务中的数据是无法被读取的。
-
数据同步问题:在多线程环境下,确保数据读写操作的同步性,避免数据竞争导致的不一致性问题。
-
数据库损坏:考虑数据库文件是否可能已损坏。如果怀疑数据库损坏,可以尝试重新创建数据库并导入数据。
请逐一排查上述可能的原因,并相应调整代码或配置。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html 。