我在我的应用程序中使用sqlite数据库。当我在世博会工作时将其作为 apk 文件下载到我的手机时,我遇到了数据库问题

问题描述 投票:0回答:1

我隐藏了我的项目ID

eas.json:

{
  "cli": {
    "version": ">= 10.2.3"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {
      "distribution": "internal"
    }
  },
  "submit": {
    "production": {
      "projectId": "YOUR_PROJECT_ID"
    }
  }
}

我收到的错误:

console.error:检查单词存在时出错:错误:对函数“NativeDatabase.prepareAsync”的调用已被拒绝。 → 原因:错误代码:没有这样的表:words,js引擎:hermes,堆栈: _construct@1:119636 包装@1:119290 致电Super@1:117282 综合错误@1:118777 ReactConsoleErrorHandler@1:118438 ?anon_0@1:1608743 asyncGeneratorStep@1:98279 _扔@1:98584 匿名@1:287104 _callTimer@1:286103 _callReactNativeMicrotasksPass@1:286247 呼叫ReactNativeMicrotasks@1:288176 __callReactNativeMicrotasks@1:107594 匿名@1:106729 __守卫@1:107468 刷新队列@1:106640

我的数据库文件:

import * as SQLite from 'expo-sqlite';

// Veritabanını aç
export const openDatabase = async () => {
    try {
        const db = await SQLite.openDatabaseAsync('englishDB.db');
        console.log("Database opened:", db);
        return db;
    } catch (error) {
        console.error('Error opening database:', error);
    }
};

// Veritabanını başlatma ve tablo oluşturma
export async function initializeDatabase(db) {
    try {
        await db.execAsync(`
            PRAGMA journal_mode = WAL;
            CREATE TABLE IF NOT EXISTS words (
                id INTEGER PRIMARY KEY NOT NULL,
                english_word TEXT NOT NULL,
                meaning TEXT NOT NULL,
                level TEXT,
                usage_sentence TEXT,
                usage_sentence_meaning TEXT
            );
            CREATE TABLE IF NOT EXISTS idioms (
                id INTEGER PRIMARY KEY NOT NULL,
                idiom TEXT NOT NULL,
                meaning TEXT NOT NULL,
                usage_sentence TEXT,
                usage_sentence_meaning TEXT
            );
        `);
        console.log('Database and tables created successfully');
    } catch (error) {
        console.error('Failed to initialize database:', error);
    }
}

// Kelime ekleme
export async function insertWord(db, word, meaning, level, usage, usageMeaning) {
    const insertStatement = await db.prepareAsync(
        'INSERT INTO words (english_word, meaning, level, usage_sentence, usage_sentence_meaning) VALUES ($word, $meaning, $level, $usage, $usageMeaning)'
    );
    try {
        const result = await insertStatement.executeAsync({
            $word: word,
            $meaning: meaning,
            $level: level,
            $usage: usage,
            $usageMeaning: usageMeaning
        });
        console.log('Inserted word with ID:', result.lastInsertRowId);
    } finally {
        await insertStatement.finalizeAsync();
    }
}

// Kelimeleri getirme
export async function getWords(db) {
    const selectStatement = await db.prepareAsync('SELECT * FROM words');
    try {
        const result = await selectStatement.executeAsync();
        const allRows = await result.getAllAsync();
        console.log('Fetched rows:', allRows); // Veriyi kontrol et
        return allRows;
    } finally {
        await selectStatement.finalizeAsync();
    }
}

export async function updateWord(db, id, wordText, meaning, level, usage, usageMeaning) {
    const updateStatement = await db.prepareAsync(
        `UPDATE words 
         SET english_word = $wordText,
             meaning = $meaning,
             level = $level,
             usage_sentence = $usage,
             usage_sentence_meaning = $usageMeaning
         WHERE id = $id`
    );
    try {
        const result = await updateStatement.executeAsync({
            $id: id,
            $wordText: wordText,
            $meaning: meaning,
            $level: level,
            $usage: usage,
            $usageMeaning: usageMeaning
        });
        console.log('Updated rows:', result.changes);
    } catch (error) {
        console.error('Error updating word:', error);
    } finally {
        await updateStatement.finalizeAsync();
    }
}


// Kelime silme
export async function deleteWord(db, id) {
    const deleteStatement = await db.prepareAsync(
        'DELETE FROM words WHERE id = $id'
    );
    try {
        const result = await deleteStatement.executeAsync({
            $id: id
        });
        console.log('Deleted rows:', result.changes);
    } finally {
        await deleteStatement.finalizeAsync();
    }
}

// Deyim ekleme
export async function insertIdioms(db, idiom, meaning, usage, usageMeaning) {
    const insertStatement = await db.prepareAsync(
        'INSERT INTO idioms (idiom, meaning, usage_sentence, usage_sentence_meaning) VALUES ($idiom, $meaning, $usage, $usageMeaning)'
    );
    try {
        const result = await insertStatement.executeAsync({
            $idiom: idiom,
            $meaning: meaning,
            $usage: usage,
            $usageMeaning: usageMeaning
        });
        console.log('Inserted idiom with ID:', result.lastInsertRowId);
    } finally {
        await insertStatement.finalizeAsync();
    }
}

// Deyimleri getirme
export async function getIdioms(db) {
    const selectStatement = await db.prepareAsync('SELECT * FROM idioms');
    try {
        const result = await selectStatement.executeAsync();
        const allRows = await result.getAllAsync();
        console.log('Fetched rows:', allRows); // Veriyi kontrol et
        return allRows;
    } finally {
        await selectStatement.finalizeAsync();
    }
}

// Deyim güncelleme
export async function updateIdiom(db, id, idiomText, meaning, usage, usageMeaning) {
    const updateStatement = await db.prepareAsync(
        `UPDATE idioms 
         SET idiom = $idiomText,
             meaning = $meaning,
             usage_sentence = $usage,
             usage_sentence_meaning = $usageMeaning
         WHERE id = $id`
    );
    try {
        const result = await updateStatement.executeAsync({
            $id: id,
            $idiomText: idiomText,
            $meaning: meaning,
            $usage: usage,
            $usageMeaning: usageMeaning
        });
        console.log('Updated rows:', result.changes);
    } finally {
        await updateStatement.finalizeAsync();
    }
}


// Deyim silme
export async function deleteIdiom(db, id) {
    const deleteStatement = await db.prepareAsync(
        'DELETE FROM idioms WHERE id = $id'
    );
    try {
        const result = await deleteStatement.executeAsync({
            $id: id
        });
        console.log('Deleted rows:', result.changes);
    } finally {
        await deleteStatement.finalizeAsync();
    }
}

export async function getRandomWord(db) {
    const selectStatement = await db.prepareAsync('SELECT * FROM words ORDER BY RANDOM() LIMIT 1');
    try {
        const result = await selectStatement.executeAsync();
        const [randomWord] = await result.getAllAsync();
        console.log('Fetched random word:', randomWord);
        return randomWord;
    } finally {
        await selectStatement.finalizeAsync();
    }
}


export async function getRandomIdiom(db) {
    const selectStatement = await db.prepareAsync('SELECT * FROM idioms ORDER BY RANDOM() LIMIT 1');
    try {
        const result = await selectStatement.executeAsync();
        const [randomIdiom] = await result.getAllAsync();
        console.log('Fetched random idiom:', randomIdiom);
        return randomIdiom;
    } finally {
        await selectStatement.finalizeAsync();
    }
}


// Hem kelimenin hem de anlamın mevcut olup olmadığını kontrol et (büyük/küçük harf duyarsız)
export async function checkWordExists(db, word, meaning) {
    try {
        const query = `
            SELECT COUNT(*) as count 
            FROM words 
            WHERE LOWER(english_word) = LOWER(?) AND LOWER(meaning) = LOWER(?);
        `;
        const [result] = await db.getAllAsync(query, [word, meaning]);
        return result.count > 0;
    } catch (error) {
        console.error('Error checking word existence:', error);
        return false;
    }
}

export async function checkIdiomExists(db, idiom, meaning) {
    try {
        const query = `
            SELECT COUNT(*) as count 
            FROM idioms 
            WHERE LOWER(idiom) = LOWER(?) AND LOWER(meaning) = LOWER(?);
        `;
        const [result] = await db.getAllAsync(query, [idiom, meaning]);
        return result.count > 0;
    } catch (error) {
        console.error('Error checking idiom existence:', error);
        return false;
    }
}


当我将应用程序转换为 apk 文件时,我希望在 expo 中工作的数据库能够工作 我分享了我在logcat中分析的日志

android sqlite expo logcat expo-eas
1个回答
0
投票

这可能是由

await db.execAsync
引起的竞争条件;尝试同步
db.exec

await
async
并不是所有问题的答案。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.