【问题标题】:Error Copying database复制数据库时出错
【发布时间】:2023-03-12 05:48:01
【问题描述】:

使用助手复制数据库没有问题。但是由于今天重新格式化了我的电脑并安装了 Eclipse,所以我不能再复制数据库了。可能是模拟器的sd卡导致问题。原木猫是这样说的。

07-23 14:23:48.875:E/AndroidRuntime(237):未捕获的处理程序:线程主因未捕获的异常而退出
07-23 14:23:48.885: E/AndroidRuntime(237): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.frux.kfcmobile/com.frux.kfcmobile.KFCmobileActivity}: android.database.sqlite.SQLiteException : 没有这样的表: first: , 编译时: SELECT *from first
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.app.ActivityThread.access$2200(ActivityThread.java:119)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.os.Handler.dispatchMessage(Handler.java:99)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.os.Looper.loop(Looper.java:123)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.app.ActivityThread.main(ActivityThread.java:4363)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 java.lang.reflect.Method.invokeNative(Native Method)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 java.lang.reflect.Method.invoke(Method.java:521)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-23 14:23:48.885: E/AndroidRuntime(237): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-23 14:23:48.885: E/AndroidRuntime(237): at dalvik.system.NativeStart.main(Native Method)
07-23 14:23:48.885: E/AndroidRuntime(237): 引起: android.database.sqlite.SQLiteException: 没有这样的表: first: , 编译时: SELECT *from first
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.database.sqlite.SQLiteProgram.native_compile(Native Method)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:59)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:49)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1220)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1193)
07-23 14:23:48.885: E/AndroidRuntime(237): at com.frux.kfcmobile.KFCmobileActivity.onCreate(KFCmobileActivity.java:42)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-23 14:23:48.885: E/AndroidRuntime(237): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

这是我的 DBHelper

公共类 DatabaseHelper 扩展 SQLiteOpenHelper{

private static String DB_PATH = "/data/data/com.frux.kfcmobile/databases/";
private static String DB_NAME = "database";
private SQLiteDatabase myDataBase; 
private final Context myContext;
private static final int DATABASE_VERSION = 1;


public DatabaseHelper(Context context) {
    // TODO Auto-generated constructor stub
    super(context, DB_NAME, null, DATABASE_VERSION);
    this.myContext = context;


}
 public void createDataBase() throws IOException{

        boolean dbExist = checkDataBase();

        if(dbExist){
            //do nothing - database already exist
            this.getWritableDatabase();
            this.close();
        }else{

            //By calling this method and empty database will be created into the default system path
               //of your application so we are gonna be able to overwrite that database with our database.
            this.getReadableDatabase();
            this.close();
            try {

                copyDataBase();

            } catch (IOException e) {

            //throw new Error("Error copying database message");

            }
        }

    }


 private boolean checkDataBase(){

        SQLiteDatabase checkDB = null;

        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){

            //database does't exist yet.

        }

        if(checkDB != null){

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }



 private void copyDataBase() throws IOException{

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

        // Path to 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 inputfile to the outputfile
        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 void openDataBase() throws SQLException{

        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

            if(myDataBase != null)
                myDataBase.close();

            super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {


    }





    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


    }

}

【问题讨论】:

  • 它看起来像一个编码错误。它试图找到一个名为“first:”的表。
  • *来自?第一的?你能发布你的完整查询吗?你是如何复制你的数据库的?
  • 我记录 cat 它说“引起:android.database.sqlite.SQLiteException:没有这样的表:first:,编译时:SELECT *from first”,您的数据库是否包含表“first”
  • 资产文件夹中数据库文件的大小是多少
  • 2.69mb。是的,数据库包含第一个表

标签: android


【解决方案1】:

关注下一行,别忘了放 .sqlite 扩展名:

private static String DB_NAME = "wfbos.sqlite";

它对我有用。

【讨论】:

    【解决方案2】:

    你可以使用我的 DbHelper..它是从资产文件夹复制的数据库...

    package com.Blog;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import android.content.Context;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    
    public class DBAdapter extends SQLiteOpenHelper 
    {
        private static String DB_NAME = "wfbos.sqlite";
        private String DB_PATH  = "";
    
        private static DBAdapter adb;
        private SQLiteDatabase db;
        private Context myContext;
    
        /*public DBAdapter(Context context, String name, CursorFactory factory,int version) 
        {
            super(context, DB_NAME, factory, 1);
    
            this.myContext = context;
            DB_PATH = "/data/data/"+myContext.getPackageName()+"/databases/";
    
        }*/
        public DBAdapter(Context context)
        {   
            super(context, DB_NAME, null,1);
    
            this.myContext = context;
            DB_PATH = "/data/data/"+myContext.getPackageName()+"/databases/";
        }
    
    
        public static synchronized DBAdapter getAdapterInstance(Context context)
        {
            if(adb == null)
            {
              adb = new DBAdapter(context);
            }
    
            return adb;
    
        }
    
    
        public void createdatabase()
        {
            boolean dbExist = checkDataBase();
            if(dbExist)
            {
    
    
            }
            else
            {
                this.getReadableDatabase();
                try 
                {
                    copyDataBase();
                } 
                catch (IOException e)
                {
                    Log.v("log",e.toString());
                    throw new Error("Error copying database");
                }
    
            }
        }
    
        private void copyDataBase() throws IOException
        {
    
            // Open your local db as the input stream
            InputStream myInput = myContext.getAssets().open(DB_NAME);
    
            // Path to 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 inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) 
            {
                myOutput.write(buffer, 0, length);
            }
            Log.v("log", "copy finish");
            // Close the streams
            myOutput.flush();
            myOutput.close();
            myInput.close();
        }
    
         private boolean checkDataBase() 
         {
             SQLiteDatabase checkDB = null;
             try 
             {
                 String myPath = DB_PATH + DB_NAME;
                 checkDB = SQLiteDatabase.openDatabase(myPath, null,
                         SQLiteDatabase.OPEN_READONLY);
             }
             catch (SQLiteException e) 
             {
             }
             if (checkDB != null)
             {
                 checkDB.close();
             }
             return checkDB != null ? true : false;
         }
    
    
         public SQLiteDatabase openDataBase() throws SQLException
         {
             // Open the database
             String myPath = DB_PATH + DB_NAME;
    
             db= SQLiteDatabase.openDatabase(myPath, null,
                     SQLiteDatabase.OPEN_READWRITE);
    
             return db;
         }
    
    
    
        @Override
        public void onCreate(SQLiteDatabase db)
        {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
        {
            // TODO Auto-generated method stub
    
        }
        @Override
        public synchronized void close() {
    
                if(db != null)
                    db.close();
    
                super.close();
    
        }
    }
    

    【讨论】:

    • 我可以知道你的avd的设置吗?
    【解决方案3】:

    您以某种方式弄乱了DBHelper 中的onCreate 方法。这没有发生,因为您之前总是创建数据库。现在您必须在新设备(您的案例新模拟器)上进行全新安装,如果失败,因为您的 Create Table 查询可能是错误的并且表没有正确创建。

    所以检查一下,我很确定这就是你的问题。

    编辑:

    我还认为您在*first 之间缺少一个空格,例如:

    SELECT * from first
    

    【讨论】:

    • 您是否尝试过从设备中删除应用程序然后重新安装?我是说初始安装失败,而不是后续覆盖。当您安装更新而不是从头开始安装新版本时,数据库已经创建,因此无需再次调用 DBHelper#OnCreate 方法
    • 是的,我先卸载应用程序,然后重新安装。它在我的设备上运行良好。
    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多