java - 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);
}
}
解决方案
推荐阅读
- android - 滚动视图只有一个直接子错误
- javascript - 选择所有不包含类的按钮,多个选项
- java - Java HttpClient - 允许受限标头不起作用
- tinymce - 自定义tinymce的调色板
- sql - SQL Select min(date) group by 对应的行
- git - 如何使用 Git 查看文件在哪些提交中被重命名?
- amazon-web-services - 如何使用包含选项中的文件路径同步 AWS S3 文件
- android - 如何在相机指向的地方绘制圆形图像?[arcore]
- ruby-on-rails - 扫描 Rails 应用程序的代码以查找 SQL 注入漏洞?
- c# - Xamarin Forms CollectionView 没有 KeyboardDismissMode 属性