uni-app设置开机自启动后sqlite数据库查不到数据

uni-app设置开机自启动后sqlite数据库查不到数据

操作步骤:

  1. app设置开机自启动
  2. sqlite数据库查不到数据
  3. 再次重启可以查到

预期结果:

  1. app设置开机自启动
  2. sqlite数据库查不到数据
  3. 再次重启可以查到

实际结果:

  1. app设置开机自启动
  2. sqlite数据库查不到数据
  3. 再次重启可以查到

bug描述:

app设置开机自启动 sqlite数据库查不到数据 再次重启可以查到

信息类别 详细信息
产品分类 uniapp/App
PC开发环境 Windows
PC操作系统版本 Windows 10 专业版 22H2
HBuilderX类型 正式
HBuilderX版本 4.02
手机系统 Android
手机系统版本 Android 10
手机厂商 小米
手机机型 小米9
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

更多关于uni-app设置开机自启动后sqlite数据库查不到数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

解决了吗?

更多关于uni-app设置开机自启动后sqlite数据库查不到数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html


延迟启动

回复 DClovd_iOS_ZYM: 延迟启动是什么意思,我们也出现类似的这种情况,但是不是必现的,偶发的,我们的处理方式是把app后台进程杀掉,重新打开app,数据就有了。博主说的延迟启动是什么意思呢 ?

uni-app 中设置开机自启动后,SQLite 数据库查不到数据,可能是由于以下几个原因导致的:

1. 数据库路径问题

  • uni-app 中,SQLite 数据库的路径可能会因为应用的运行环境不同而发生变化。开机自启动时,应用的运行环境可能发生了变化,导致数据库路径不一致。
  • 解决方案:确保在应用启动时,数据库路径是正确的。可以使用 plus.iouni.getFileSystemManager() 来获取正确的数据库路径。
const dbPath = plus.io.convertLocalFileSystemURL('_www/your-database.db');
const db = openDatabase(dbPath, '1.0', 'Your Database', 2 * 1024 * 1024);

2. 数据库未初始化

  • 开机自启动时,可能数据库还没有被正确初始化或打开,导致查询不到数据。
  • 解决方案:确保在应用启动时,数据库已经被正确初始化。
document.addEventListener('plusready', function() {
    const db = openDatabase('your-database.db', '1.0', 'Your Database', 2 * 1024 * 1024);
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM your_table', [], function(tx, result) {
            console.log(result.rows);
        }, function(tx, error) {
            console.log('Query failed: ' + error.message);
        });
    });
}, false);

3. 权限问题

  • 在开机自启动时,应用可能没有足够的权限访问数据库文件。
  • 解决方案:确保应用有读写存储的权限。可以在 manifest.json 中配置相关权限。
{
    "permissions": {
        "android": [
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE"
        ],
        "ios": []
    }
}

4. 数据库文件被删除或覆盖

  • 开机自启动时,可能数据库文件被删除或覆盖,导致查询不到数据。
  • 解决方案:在应用启动时,检查数据库文件是否存在,如果不存在则重新创建。
const fs = uni.getFileSystemManager();
fs.access({
    path: dbPath,
    success: function() {
        console.log('Database exists');
    },
    fail: function() {
        console.log('Database does not exist, creating...');
        fs.copyFile({
            srcPath: '_www/your-database-template.db',
            destPath: dbPath,
            success: function() {
                console.log('Database created');
            },
            fail: function(err) {
                console.log('Failed to create database: ' + err.errMsg);
            }
        });
    }
});

5. 异步加载问题

  • 数据库操作可能是异步的,未等待数据库加载完成就进行查询。
  • 解决方案:确保在数据库加载完成后再进行查询。
document.addEventListener('plusready', async function() {
    const db = openDatabase('your-database.db', '1.0', 'Your Database', 2 * 1024 * 1024);
    await new Promise((resolve) => {
        db.transaction(function(tx) {
            tx.executeSql('SELECT * FROM your_table', [], function(tx, result) {
                console.log(result.rows);
                resolve();
            }, function(tx, error) {
                console.log('Query failed: ' + error.message);
                resolve();
            });
        });
    });
}, false);

6. 应用生命周期问题

  • 开机自启动时,应用的生命周期可能没有完全启动,导致数据库操作失败。
  • 解决方案:确保在应用的生命周期事件(如 onLaunch)中执行数据库操作。
App({
    onLaunch: function() {
        const db = openDatabase('your-database.db', '1.0', 'Your Database', 2 * 1024 * 1024);
        db.transaction(function(tx) {
            tx.executeSql('SELECT * FROM your_table', [], function(tx, result) {
                console.log(result.rows);
            }, function(tx, error) {
                console.log('Query failed: ' + error.message);
            });
        });
    }
});
回到顶部