首页 > 解决方案 > java.lang.Error:从 assets 文件夹中复制 SQLite 数据库中的数据库时出错

问题描述

我在 SQLlite 浏览器中设计了数据库。现在我得到了这个错误。数据库无法从资产文件夹中复制。

它向我显示了这个错误

2021-01-13 13:35:26.126 9933-9933/com.example.wallpaperapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.wallpaperapp, PID: 9933
    java.lang.Error: Error Copying Database
        at com.example.wallpaperapp.utils.SqliteHelperClass.onCreateDatabase(SqliteHelperClass.java:50)
        at com.example.wallpaperapp.MainActivity.onCreate(MainActivity.java:39)

SQLiteHelper 类

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.os.Environment;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class SqliteHelperClass extends SQLiteOpenHelper {

    Context context;
    SQLiteDatabase db = null;
    public static final String dbname = "wallpaperApp.db";
    public String dbPath = "";

    public SqliteHelperClass(Context context) {
        super(context, dbname, null, 1);
        this.context = context;

        if (Build.VERSION.SDK_INT >= 15) {

            this.dbPath = context.getApplicationInfo().dataDir + "/databases/";

        } else {
            this.dbPath = Environment.getDataDirectory() + "/data/" + context.getPackageName() + "/" + "database/";
        }

    }

    //Create the Database
    public void onCreateDatabase() throws IOException {
        boolean dbExist = checkDatabase();

        if (dbExist) {

        } else {
            try {
                this.getReadableDatabase();
                copyDatabase();

            } catch (Exception e) {

                throw new Error("Error Copying Database");
            }
        }

    }

    //check Database

    private boolean checkDatabase() {

        SQLiteDatabase checkDb = null;
        try {
            String mypath = dbPath + dbname;
            checkDb = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READONLY);
        }
        catch (Exception e) {
        }

        if (checkDb != null) {
            checkDb.close();
        }

        return checkDb != null? true : false;

    }

    private void copyDatabase() throws IOException {
        InputStream inputStream = context.getAssets().open(dbname);

        String outFilename = dbPath = dbname;
        OutputStream myOutput = new FileOutputStream(outFilename);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        myOutput.flush();
        myOutput.close();
        inputStream.close();

    }

    public void openDatabase() throws Exception {
        String mypath = dbPath + dbname;
        db = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READONLY);
    }

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

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

        if (oldVersion > newVersion) {
            try {
                copyDatabase();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    public Cursor readData(String query){

        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
        Cursor cursor = sqLiteDatabase.rawQuery(query, null);
        return cursor;
    }

    public void updateDataForFavorite(String id, String isFav)
    {
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("isFav",isFav);
        database.update("wallpapers",contentValues,"id=?",new String[]{id});

    }
}

MainActivity.java

package com.example.wallpaperapp;

import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.widget.GridView;
import android.widget.Toast;

import com.example.wallpaperapp.adapters.GridViewAdapter;
import com.example.wallpaperapp.models.ImagesConstant;
import com.example.wallpaperapp.utils.SqliteHelperClass;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    GridView gridView;
    GridViewAdapter gridViewAdapter;
    List<ImagesConstant> imagesConstantList;

    SqliteHelperClass sqLiteHelperClass;
    Cursor cursor = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gridView = (GridView) findViewById(R.id.gridView);
        imagesConstantList  = new ArrayList<>();

        sqLiteHelperClass = new SqliteHelperClass(MainActivity.this);

        try {
            sqLiteHelperClass.onCreateDatabase();
            sqLiteHelperClass.openDatabase();


        } catch (Exception e) {
            e.printStackTrace();
        }


        addData();
    }

    private void addData() {
        cursor = sqLiteHelperClass.readData("SELECT id, images, isFav from wallpapers;");
        if (cursor.moveToFirst()){

            do {

                int id = cursor.getInt(0);
                String image = cursor.getString(1);
                int isFav = cursor.getInt(2);

                ImagesConstant imagesConstant = new ImagesConstant(id,image,isFav);

                imagesConstantList.add(imagesConstant);

            }while (cursor.moveToNext());

            showGrid();

        }else {
            Toast.makeText(MainActivity.this, "Data Not Found", Toast.LENGTH_SHORT).show();
        }
    }

    void showGrid(){

        gridViewAdapter = new GridViewAdapter(MainActivity.this,imagesConstantList);
        gridView.setAdapter(gridViewAdapter);
    }
}

标签: javaandroidsqlite

解决方案


推荐阅读