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

4 回复

楼主你好,数据库开发建议不要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数据库数据读取不到的问题,可能是以下几个原因:

  1. 数据库文件路径问题:确保数据库文件的路径正确无误,并且应用具有对该路径的读写权限。路径错误或权限不足都会导致无法访问数据库文件。

  2. 数据库连接问题:检查数据库连接是否成功建立。如果连接失败,后续的读取操作自然无法进行。

  3. SQL查询语句问题:验证SQL查询语句是否正确。错误的查询语句或语法错误都会导致无法正确读取数据。

  4. 事务处理:如果涉及到事务处理,确保事务正确提交或回滚。未提交的事务中的数据是无法被读取的。

  5. 数据同步问题:在多线程环境下,确保数据读写操作的同步性,避免数据竞争导致的不一致性问题。

  6. 数据库损坏:考虑数据库文件是否可能已损坏。如果怀疑数据库损坏,可以尝试重新创建数据库并导入数据。

请逐一排查上述可能的原因,并相应调整代码或配置。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部