首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLiteManager:打开文件时出错吗?

SQLiteManager:打开文件时出错吗?
EN

Stack Overflow用户
提问于 2015-11-22 09:11:38
回答 1查看 170关注 0票数 1

我在SQLite文件夹中有一个assets数据库,然后在app数据文件夹中复制它。

然后,我把它复制到我的电脑上看数据,但得到以下的错误。

这是我的DB.java:

代码语言:javascript
复制
public class DB extends SQLiteOpenHelper {
    public static final String DIR_SDCARD = Environment
            .getExternalStorageDirectory().getAbsolutePath();
    public static final String DIR_DATABASE = DIR_SDCARD + "/Android/data/";
    private static String DB_NAME = "Rulling_DB.sqlite";
    private final Context myContext;
    public static String PACKAGE_NAME;
    public boolean flag = 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 = DIR_DATABASE + PACKAGE_NAME + "/Rulling/" + 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;
        try {
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
        } catch (IOException e) {
            Log.e("Copy", e.toString());
        }
        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;

        try {

            checkDB = SQLiteDatabase.openDatabase(DIR_DATABASE + PACKAGE_NAME
                    + "/Rulling/" + DB_NAME, null, 0);

        } catch (SQLiteException e) {
            Log.e("asdf", "checkDataBase-->" + e.toString());
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    @Override
    public synchronized SQLiteDatabase getReadableDatabase() {
        return super.getReadableDatabase();
    }

    public DB(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }

    public void CreateandOpenDataBase() throws IOException {
        boolean dbExist = false;
        try {
            dbExist = checkDataBase();
        } catch (Exception e) {
            Log.i("ERROR", "ERROR in DB Class");
        }
        if (dbExist) {
        } else {
            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database --> " + e.toString());
            }
        }
    }

    public SQLiteDatabase openDataBase() throws SQLException {
        return SQLiteDatabase.openOrCreateDatabase(DIR_DATABASE + PACKAGE_NAME
                + "/Rulling/" + DB_NAME, null);
    }

    public boolean CreateFile() {
        if (flag == false) {
            File file = new File(DIR_DATABASE);
            file.mkdirs();
            return true;
        } else {
            return true;
        }
    }

    public void GetPackageName(String res) {
        PACKAGE_NAME = res;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }
}

这是我的save.java:

代码语言:javascript
复制
public class Save_GetResponse{

    public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
    public static final String DIR_DATABASE = DIR_SDCARD +"/Android/data/";

    public SQLiteDatabase sql;
    public static String PACKAGE_NAME;

    public long InsertData(GetReponse_Structure GRS,Context context){
        DB db = new DB(context);
        PACKAGE_NAME = context.getApplicationContext().getPackageName();
        File file= new File(DIR_DATABASE + PACKAGE_NAME + "/Rulling");
        file.mkdirs();
        db.GetPackageName(PACKAGE_NAME);
        db.CreateFile();
        try {
            db.CreateandOpenDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }
        sql = db.openDataBase();


        ContentValues values = new ContentValues();
        values.put("ID", GRS._Id );
        values.put("Title",GRS._Title);
        values.put("MetaDataID", GRS._MetaDataID);
        values.put("Comment", GRS._Comment);
        values.put("Tafsir", GRS._Tafsir);
        values.put("CategoryID", GRS._CategoryID);
        values.put("ParentID", GRS._ParentID);
        values.put("LanguageID", GRS._LanguageID);
        values.put("TypeInfo", GRS._TypeInfo);
        values.put("TableName", GRS._TableName);
        values.put("Pavaragi", GRS._Pavaragi);

        long LastId = sql.insert("Response_tbl", null, values);
        sql.close();
        return LastId;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-22 10:43:27

您应该简单地将数据库文件复制到目标路径,而不是保存文件。

这将是fastersafer

在将其从assets文件夹复制到data path时,确实应该使用相同的方法。

这一次,您应该将data path复制到SD card (要么将输入和输出路径参数化,要么编写另一个方法)。

等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33853229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档