Amamiya
Amamiya
  • 发布:2020-01-11 17:00
  • 更新:2022-03-21 18:54
  • 阅读:2432

关于读取内置sqlite数据库的问题

分类:HBuilderX

我目前使用的HBuilderX 2.5.1版本,开发的一个测试的应用程序
我有一个已经有了一些数据的基础数据库,我只需要读取并不需要写入这个数据库(当然能写更好),我目前把它放在这个目录下面

然后我尝试了各种路径
./data/data.db
/data/data.db
../../data/data.db
_www/data/data.db
_doc/data.db 此时我把目录从data重命名成_doc
但是都不行,无法打开数据库,没有报错,但是没有任何响应,也没有调用我的回调函数。

执行到了plus.sqlite.openDatabase,但是两个回调函数都没有执行。

请求各位大佬给与支援,谢谢。

2020-01-11 17:00 负责人:无 分享
已邀请:
s***@163.com

s***@163.com

我把数据库放在static下,然后代码如下:

        onLoad() {  
            //检查是否存在数据库,如果不存在,则将static文件夹中预制数据库复制过去  
            plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs){  
                //查找数据库文件  
                fs.root.getFile('data.db', {create:false}, function(fileEntry){  
                    //存在则无动作  
                }, function(e){  
                    //不存在则复制  
                    //查找static文件夹下的数据库  
                    plus.io.resolveLocalFileSystemURL('_www/static/data.db', function(entry){  
                        //找到则复制过去  
                        //获取目标地址  
                        //\内部存储设备\Android\data\io.dcloud.HBuilder\apps\HBuilder\doc  
                        plus.io.resolveLocalFileSystemURL('_doc/', function(docEntry){  
                            //源地址到目标地址复制  
                            entry.copyTo(docEntry,'data.db',function(){  
                                //复制失败未处理  
                            });    
                        });  
                    });    
                });      
            });   
            //调用数据库,查询任务名称列表  
            plus.sqlite.openDatabase({  
                name: 'data',  
                path: '_doc/data.db',  
                success: function(e){  
                    console.log('openDatabase success!');  
                    //plus.nativeUI.alert('打开数据库data.db成功 ');  
                },  
                fail: function(e){  
                    console.log('openDatabase failed: '+JSON.stringify(e));  
                    //plus.nativeUI.alert('打开数据库data.db失败: ' + JSON.stringify(e));  
                }  
            });  
            plus.sqlite.selectSql({  
                name: 'data',  
                sql: 'select * from tasks',  
                success: function(data){  
                    console.log('selectSql success: ');  
                    for(var i in data){  
                        console.log(data[i]);  
                        this.taskList.push(data[i]);  
                    }  
                },  
                fail: function(e){  
                    console.log('selectSql failed: '+JSON.stringify(e));  
                }  
            });  
        }
Amamiya

Amamiya (作者) - 什么都会一点什么都很水的IT男……

补充一点,已经在模块权限配置中给了Sqlite的权限了。

  • 75830568

    您好,请问这个问题怎么解决的

    2020-03-25 09:58

6***@qq.com

6***@qq.com - 90后IT男|CEO|创始人

没写查询语句啊你……
打开数据库使用查询后要记得关闭,否则会导致不能用也不报错

6***@qq.com

6***@qq.com

你试试 path: _www/data/data.db 但是这个目录只能读,不能写;

  • stars云

    怎么样才能读和写哇

    2020-07-30 13:55

美好时光

美好时光

我也遇到同样的问题,我也是有个数据库有数据,需要使用,我用sqlite expert professional建了一个sqlite数据库,但不知道_doc目录在哪里,放在doc目录中没执行回调函数,究竟是怎么回事?请教大家帮忙解决一下,谢谢!

l***@live.cn

l***@live.cn

要放在手机的,android目录,data....io dcloud.hbuilder.....apps....hbuilder...doc目录下。我是这样用的。然后运行时,选运行
到手机上。

美好时光

美好时光

我是在手机上调试的,_doc目录是app安装后生成的,是个相对目录,我已成功使用sqlite。
另外,请问下,如果app升级后,原有以前在sqlite中的数据还存在吗?能继续使用吗?谢谢!

  • 1***@qq.com

    请问你是如何用可视化工具,连接手机上的数据库,感谢

    2021-12-29 13:41

ccfto

ccfto

*.db文件放在 Hbuilder 项目目录里面 运行 或者 生成本地打包资源 在APP中会出现读写问题,
解决办法可以参考:
https://ask.dcloud.net.cn/question/129044

也可以
openDatabase 方法调用的时候会自动在_UNI__****/doc/ 目录创建一个 .db文件 该.db里面是空的
然后判断当前数据库是否存在相关表,如果存在执行查询、插入
如果不存在 需要将创建表的相关脚本都执行一遍

代码:
methods: {
openSqlite: function(success, error){
//打开本地数据库
var isOpen = plus.sqlite.isOpenDatabase({
name:'history',
path:'_doc/history.db',
})
if(!isOpen){
plus.sqlite.openDatabase({
name:'history',
path:'_doc/history.db',
success:function(e){
console.log(e);
success(e);
},
fail:function(e){
console.log(e);
error(e);
}
});
}else{
success();
}
},
querySqlite: function(sql, success, error){
plus.sqlite.selectSql({
name:'history',
sql:sql,
success:function(e){
console.log(e);
success(e);
},
fail:function(e){
console.log(e);
error(e);
}
})
},
executeSqlite: function(sql, success, error){
plus.sqlite.executeSql({
name:'history',
sql:sql,
success:function(e){
console.log(e);
success(e);
},
fail:function(e){
console.log(e);
error(e);
}
});
},
closeSqlite: function(){
plus.sqlite.closeDatabase({
name:'history',
success:function(e){
console.log(e);
uni.showToast({
icon: 'none',
title: '关闭成功!' JSON.stringify(e),
})
},
fail:function(e){
console.log(e);
uni.showToast({
icon: 'none',
title: '关闭失败!' JSON.stringify(e),
})
}
});
},
submit:function(){
var that = this;
if(true){
that.openSqlite(function(){

                    that.querySqlite("select * from sqlite_master where name = 'scan_m' and type='table'", function(e){  
                        if(e.length == 0){  
                            console.log('创建数据表!');  
                            that.executeSqlite("CREATE TABLE scan_m(id int primary key not null, loginId text not null, gzdd text not null, scanTime text not null, labelList text not null)", function(e){  
                                console.log('创建数据表成功!');  

                                that.querySqlite('select max(id) as maxId from scan_m', function(e){  
                                    var id = 1,  
                                        loginId = "",  
                                        gzdd = "",  
                                        rq = "",  
                                        data = "";  
                                    if(e.length == 0){  
                                        console.log('数据不存在!');  
                                        id = 1  
                                    }else{  
                                        console.log('数据存在!');  
                                        id = e[0]['maxId'] 1;   
                                    }  
                                    loginId = getApp().globalData.loginId;  
                                    gzdd = '123';//that.gzddCalc;  
                                    rq = (new Date()).toISOString();  
                                    data = 'adsfad';//labelListStr;  

                                    that.executeSqlite("insert into scan_m (id, loginId, gzdd, scanTime, labelList) values (" id ",'" loginId "','" gzdd "','" rq "','" data "')",function(){  
                                        console.log('插入数据成功!');  
                                        that.closeSqlite();  
                                    },function(e){  
                                        console.log('插入数据失败!' JSON.stringify(e));  
                                        that.closeSqlite();  
                                    });  
                                },function(e){  
                                    that.closeSqlite();  
                                });  
                            },function(e){  
                                console.log('创建数据表失败!');  
                                that.closeSqlite();  
                            })  
                        }else{  
                            console.log('数据表存在!');  

                            that.querySqlite('select max(id) as maxId from scan_m', function(e){  
                                var id = 1,  
                                    loginId = "",  
                                    gzdd = "",  
                                    rq = "",  
                                    data = "";  
                                if(e.length == 0){  
                                    console.log('数据不存在!');  
                                    id = 1  
                                }else{  
                                    console.log('数据存在!');  
                                    id = e[0]['maxId'] 1;   
                                }  
                                loginId = getApp().globalData.loginId;  
                                gzdd = '123';//that.gzddCalc;  
                                rq = (new Date()).toISOString();  
                                data = 'adsfad';//labelListStr;  

                                that.executeSqlite("insert into scan_m (id, loginId, gzdd, scanTime, labelList) values (" id ",'" loginId "','" gzdd "','" rq "','" data "')",function(){  
                                    console.log('插入数据成功!');  
                                    that.closeSqlite();  
                                },function(e){  
                                    console.log('插入数据失败!' JSON.stringify(e));  
                                    that.closeSqlite();  
                                });  
                            },function(e){  
                                that.closeSqlite();  
                            });  
                        }  
                    }, function(e){  
                        that.closeSqlite();  
                    });  
                });  
                return false;  
            }  
        }  
    }

该问题目前已经被锁定, 无法添加新回复