jackiesky1206 2021-12-23 10:25 采纳率: 0%
浏览 56
已结题

Harmony 鸿蒙关于在不同Ability页面中的Sqlite数据库操作问题

求大家帮忙,本人在编写一个数据库App中,按照以前android的思路,结合harmony官方文档对sqlite数据库进行增删改查操作时遇到了数据库不同步的问题,具体先看图,在上源代码和项目结构:

项目有五个Ability页面,分别是:MainAbility(主页面)、ZengJiaAbility(添加页面)、XiuGaiAbility(修改页面)、ShanChuAbility(删除页面)、ChaXunAbility(查询页面),如下图:

img


img


img


img


img

存在问题:数据库初始化后,在添加页面中添加数据后,在ZengJiaAbility页面能够查询到数据库数据,但是在ChaXunAbility页面中却查不到数据,如下图:

img


img

下面上项目目录图和源代码,希望大家帮忙指正!谢谢大家了,都琢磨了快一周了。

img

以下开始上源代码:

一、MainAbility 和MainAbilitySlice

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
    }
}



public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {

    private Button cx,xg,tj,sc;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        cx = (Button)findComponentById(ResourceTable.Id_chuxun_button);
        xg = (Button)findComponentById(ResourceTable.Id_xiugai_button);
        tj = (Button)findComponentById(ResourceTable.Id_tianjia_button);
        sc = (Button)findComponentById(ResourceTable.Id_shanchu_button);

        cx.setClickedListener(this);
        xg.setClickedListener(this);
        tj.setClickedListener(this);
        sc.setClickedListener(this);
    }

    @Override
    public void onClick(Component component) {
        switch(component.getId()){
            case ResourceTable.Id_chuxun_button:
                HiLog.info(DBHelper.label,"查询数据页面打开成功");
                Intent intent = new Intent();
                Operation operation = new Intent.OperationBuilder()
                        .withBundleName("com.riton.jackie.shifu")
                        .withAbilityName(ChaXunAbility.class)
                        .build();
                intent.setOperation(operation);
                startAbility(intent);
                new ToastDialog(getContext())
                        .setText("查询数据成功")
                        .show();
                break;
            case ResourceTable.Id_xiugai_button:
                HiLog.info(DBHelper.label,"修改数据页面打开成功");
                Intent intent1 = new Intent();
                Operation operation1 = new Intent.OperationBuilder()
                        .withBundleName("com.riton.jackie.shifu")
                        .withAbilityName(XiuGaiAbility.class)
                        .build();
                intent1.setParam("id",1);
                intent1.setOperation(operation1);
                startAbility(intent1);
                new ToastDialog(getContext())
                        .setText("修改数据成功")
                        .show();
                break;
            case ResourceTable.Id_tianjia_button:
                HiLog.info(DBHelper.label,"添加数据页面打开成功");
                Intent intent0 = new Intent();
                Operation operation0 = new Intent.OperationBuilder()
                        .withBundleName("com.riton.jackie.shifu")
                        .withAbilityName(ZengJiaAbility.class)
                        .build();
                intent0.setOperation(operation0);
                startAbility(intent0);
                new ToastDialog(getContext())
                        .setText("添加数据成功")
                        .show();
                break;
            case ResourceTable.Id_shanchu_button:
                HiLog.info(DBHelper.label,"删除数据页面打开成功");
                Intent intent2 = new Intent();
                Operation operation2 = new Intent.OperationBuilder()
                        .withBundleName("com.riton.jackie.shifu")
                        .withAbilityName(ShanChuAbility.class)
                        .build();
                intent2.setParam("id",1);
                intent2.setOperation(operation2);
                startAbility(intent2);
                new ToastDialog(getContext())
                        .setText("删除数据成功")
                        .show();
                break;
        }
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

二、DingDan实体对象和DingDanServices平台业务逻辑层


public class DingDan {
    public String ddbh,khxm;
    public int id,khdh,ptid;

    public int getDdid(){
        return id;
    }
    public void setDdid(int id){
        this.id = id;
    }
    
    public int getPtid(){
        return ptid;
    }
    public void setPtid(int ptid){
        this.ptid = ptid;
    }
    
    public String getDdbh(){
        return ddbh;
    }
    public void setDdbh(String ddbh){
        this.ddbh = ddbh;
    }
    
    public String getKhxm(){return khxm;}
    public void setKhxm(String khxm){
        this.khxm = khxm;
    }

    public DingDan(){
        super();
    }
}

复制

public class DingDanServices {

    private RdbStore store;
    private DatabaseHelper helper ;

    public DingDanServices(Context context) {
        helper = new DatabaseHelper(context);
        StoreConfig config = StoreConfig.newDefaultConfig("andd.db");
        RdbOpenCallback callback = new RdbOpenCallback() {
            @Override
            public void onCreate(RdbStore rdbStore) {
                String sql = "CREATE TABLE IF NOT EXISTS DingDan (" +
                        "id INTEGER  PRIMARY KEY AUTOINCREMENT," +
                        "ptid INTEGER," +
                        "ddbh VARCHAR (20)," +
                        "khxm VARCHAR (20)" +
                        ")";
                rdbStore.executeSql(sql);
                //store.executeSql("create table if not exists PingTai (id INTEGER PRIMARY KEY AUTOINCREMENT,ptmc text,ptys text)");
            }

            @Override
            public void onUpgrade(RdbStore rdbStore, int i, int i1) {

            }
        };
        store = helper.getRdbStore(config,1,callback,null);
    }

    public boolean insert(DingDan dd){
        ValuesBucket vb = new ValuesBucket();
        vb.putInteger("ptid",dd.getPtid());
        vb.putString("ddbh",dd.getDdbh());
        vb.putString("khxm",dd.getKhxm());
        boolean isinsert = false;
        if(store.insert("DingDan",vb)>0){
            isinsert = true;
        }
        return isinsert;
    }

    public boolean update(DingDan dd){
        ValuesBucket vb = new ValuesBucket();
        vb.putInteger("ptid",dd.getPtid());
        vb.putString("ddbh",dd.getDdbh());
        vb.putString("khxm",dd.getKhxm());
        boolean isupdate = false;

        RdbPredicates predicates = new RdbPredicates("DingDan");
        predicates.equalTo("id",dd.getDdid());
        if(store.update(vb,predicates)>0){
            isupdate = true;
        }
        return isupdate;
    }

    public List<DingDan> getDingDans(){
        List<DingDan> dds = new ArrayList<>();
        ResultSet rs = store.querySql("select id,ddbh,khxm from DingDan",null);
        while (rs.goToNextRow()){
            DingDan dd = new DingDan();
            dd.setDdid(rs.getInt(rs.getColumnIndexForName("id")));
            dd.setDdbh(rs.getString(rs.getColumnIndexForName("ddbh")));
            dd.setKhxm(rs.getString(rs.getColumnIndexForName("khxm")));
            dds.add(dd);
        }
        return dds;
    }

    public boolean delete(int id){
        boolean isdelete = false;
        RdbPredicates predicates = new RdbPredicates("DingDan");
        predicates.equalTo("id",id);
        if(store.delete(predicates)>0){
            isdelete = true;
        }
        return isdelete;
    }

}

三、ZengJiaAbility和 ZengJiaAbilitySlice


public class ZengJiaAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(ZengJiaAbilitySlice.class.getName());
    }
}


public class ZengJiaAbilitySlice extends AbilitySlice {

    private Button zjbutton;
    private DingDanServices ddservies;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_zengjia);
        ddservies = new DingDanServices(getContext());

        zjbutton = (Button) findComponentById(ResourceTable.Id_zengjia_zjbutton);
        zjbutton.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                DingDan dd = new DingDan();
                dd.setDdbh("0001");
                dd.setKhxm("申明");
                if (ddservies.insert(dd)) {
                    HiLog.info(DBHelper.label, "插入数据成功");
                    List<DingDan> dds = new ArrayList<>();
                    dds = ddservies.getDingDans();
                    for(DingDan dd1 : dds){
                        HiLog.info(DBHelper.label,""+dd1.getDdid()+"、"+dd1.getDdbh()+"==="+dd1.getKhxm());
                    }
                } else {
                    HiLog.info(DBHelper.label, "插入数据失败");
                }
            }
        });
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

四、ChaXunAbility和ChaXunAbilitySlice


public class ChaXunAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(ChaXunAbilitySlice.class.getName());
    }
}


public class ChaXunAbilitySlice extends AbilitySlice {
    private ListContainer list;
    private DingDanServices ddservices;
    private List<DingDan>  ddlist;
    private ListItemProvider listItemProvider;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_chaxun);
        list = (ListContainer)findComponentById(ResourceTable.Id_chaxun_list);
        ddlist = new ArrayList<>();
        ddservices = new DingDanServices(this);

        ddlist = ddservices.getDingDans();
        if(ddlist.size()>0){
        listItemProvider = new ListItemProvider(ChaXunAbilitySlice.this,ddlist);
        list.setItemProvider(listItemProvider);
        }else{
            HiLog.info(DBHelper.label,"查不到数据");
        }

    }


    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

}

五、其他代码


public class DBHelper {

    public static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP,0x00201,"MyTag");
}



public class ListItemProvider extends BaseItemProvider {
    private List<DingDan> ddlist;
    private AbilitySlice slice;

    public ListItemProvider(AbilitySlice slice,List<DingDan> list) {
        this.ddlist = list;
        this.slice = slice;
    }

    @Override
    public int getCount() {
        return ddlist.size();
    }

    @Override
    public Object getItem(int i) {
        return ddlist.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public Component getComponent(int i, Component component, ComponentContainer componentContainer) {
        Component cpt = component;
        SettingHolder holder;
        DingDan pt = ddlist.get(i);
        if (component == null) {
            cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_dingdanitem1, null, false);
            holder = new SettingHolder(cpt);
            cpt.setTag(holder);
        } else {
            cpt = component;
            holder = (SettingHolder) cpt.getTag();
        }
        holder.ddid.setText(pt.getDdid()+"");
        holder.ddbh.setText(pt.getDdbh());
        holder.khxm.setText(pt.getKhxm());
        return cpt;
    }


    // 用于保存列表项中的子组件信息
    public class SettingHolder {
        Text ddbh,khxm;
        Text ddid;

        SettingHolder(Component component) {
            ddid = (Text) component.findComponentById(ResourceTable.Id_dingdanitem_ddid);
            ddbh = (Text) component.findComponentById(ResourceTable.Id_dingdanitem_ddbh);
            khxm = (Text) component.findComponentById(ResourceTable.Id_dingdanitem_khxm);
        }

    }
}

大家有没有找出问题所在,希望大家帮帮忙,帮我快点解决这个问题,现在项目就卡数据存储在这里进行不下去了。其他的所有功能都实现了。

再次感谢大家!

  • 写回答

2条回答 默认 最新

  • jackiesky1206 2021-12-23 21:40
    关注

    有没有看出问题所在的?大家帮帮忙

    评论

报告相同问题?

问题事件

  • 系统已结题 12月31日
  • 修改了问题 12月23日
  • 创建了问题 12月23日

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误