某些设备上的 Android 中出现“没有这样的表”问题

2024-04-03

我在 Android 应用程序中使用外部数据库,它在所有模拟器和三星真实设备上运行良好。但是当我检查宏碁智能手机时,我的应用程序崩溃并出现以下异常:

android.database.sqlite.SQLiteException: no such table:

这对我来说很奇怪。我已经检查了文件资源管理器中的数据文件夹,其中存在我的数据库和所有表。

我不明白为什么会发生这种情况。

请指导我。提前致谢

sql辅助类的代码如下:

public class MyDatabaseHelper extends SQLiteOpenHelper {

    // System path of application database.
    private static String DB_PATH = MyApplication.getAppContext()
            .getFilesDir().getParentFile().getPath()
            + "/databases/";
    private static String DB_NAME = "myDB";
    private SQLiteDatabase myDataBase;
    private final Context myContext;

    /**
     * Constructor Takes and keeps a reference of the passed context in order to
     * access to the application assets and resources.
     * 
     * @param context
     */
    public MyDatabaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }

    /**
     * Creates a empty database on the system and rewrites it with own database.
     * 
     */
    public void createDataBase() throws IOException {

        checkDataBase();
        // Creates empty database default system path
        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }

    /**
     * Checks if the database already exist to avoid re-copying the file each
     * time whenever the application opened.
     * 
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase() {

        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLiteException e) {
            e.printStackTrace();
        }

        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    /**
     * Copies database from local assets-folder to the just created empty
     * database in the system folder and from where it can be accessed and
     * handled using byte stream transferring.
     * 
     */
    private void copyDataBase() throws IOException {

        // Open local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME + ".db");

        // Path of the just created empty db
        String outFileName = DB_PATH + DB_NAME;

        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        // transfer bytes from the input file to the output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public SQLiteDatabase openDataBase() throws SQLException {

        // Opens the database
        String myPath = DB_PATH + DB_NAME;
        return SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);
    }

    @Override
    public synchronized void close() {
        if (myDataBase != null)
            myDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
    }
}

最后我解决了我的问题。

我只是将可读数据库放入数据库并在再次打开它后将其关闭。我的完整代码如下:

 public class MyDatabaseHelper extends SQLiteOpenHelper {

    // System path of application database.
    private static String DB_PATH = MyApplication.getAppContext()
            .getFilesDir().getParentFile().getPath()
            + "/databases/";
    private static String DB_NAME = "myDB";
    private SQLiteDatabase myDataBase;
    private final Context myContext;

    /**
     * Constructor Takes and keeps a reference of the passed context in order to
     * access to the application assets and resources.
     * 
     * @param context
     */
    public MyDatabaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }

    /**
     * Creates a empty database on the system and rewrites it with own database.
     * 
     */
    public void createDataBase() throws IOException {

        checkDataBase();
        SQLiteDatabase db_Read = null;

        // Creates empty database default system path
        db_Read = this.getReadableDatabase();
        db_Read.close();
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }

    /**
     * Checks if the database already exist to avoid re-copying the file each
     * time whenever the application opened.
     * 
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase() {

        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLiteException e) {
            e.printStackTrace();
        }

        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    /**
     * Copies database from local assets-folder to the just created empty
     * database in the system folder and from where it can be accessed and
     * handled using byte stream transferring.
     * 
     */
    private void copyDataBase() throws IOException {

        // Open local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME + ".db");

        // Path of the just created empty db
        String outFileName = DB_PATH + DB_NAME;

        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        // transfer bytes from the input file to the output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public SQLiteDatabase openDataBase() throws SQLException {

        // Opens the database
        String myPath = DB_PATH + DB_NAME;
        return SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);
    }

    @Override
    public synchronized void close() {
        if (myDataBase != null)
            myDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
    }
}

我找到了我的答案here http://www.anddev.org/networking-database-problems-f29/missing-table-in-sqlite-with-specific-version-of-desire-hd-t50364.html:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

某些设备上的 Android 中出现“没有这样的表”问题 的相关文章

随机推荐