“文件已加密或不是数据库”错误

时间:2016-06-16 02:59:31

标签: android database

我正在尝试将数据库导入Android Studio。 现在,我的资产文件夹中有一个数据库,我将它显示在列表视图中。我收到“文件已加密或不是数据库”错误。

我不确定Android Studio支持哪些数据库文件类型。我正在使用SQL。 我将我的数据库帮助程序类命名为Ingredient Helper。

我非常感谢您提供的任何建议。这是我的logcat和java文件。

谢谢!

logcat的:

06-15 21:04:52.504    2157-2157/? E/NetworkScheduler.SchedulerReceiver﹕ Invalid parameter app
06-15 21:04:52.504    2157-2157/? E/NetworkScheduler.SchedulerReceiver﹕ Invalid package name : Perhaps you didn't include a PendingIntent in the extras?
06-15 21:04:52.787    3023-3023/? E/memtrack﹕ Couldn't load memtrack module (No such file or directory)
06-15 21:04:52.788    3023-3023/? E/android.os.Debug﹕ failed to load memtrack module: -2

06-15 21:04:52.940    3054-3054/? E/SQLiteLog﹕ (14) cannot open file at line 31278 of [2ef4f3a5b1]
06-15 21:04:52.940    3054-3054/? E/SQLiteLog﹕ (14) os_unix.c:31278: (2) open(/data/data/com.dsallee.elsdbexecute/databases/sqlite3.sql) -
06-15 21:04:52.941    3054-3054/? E/SQLiteDatabase﹕ Failed to open database '/data/data/com.dsallee.elsdbexecute/databases/sqlite3.sql'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
        at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
        at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
        at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
        at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
        at com.dsallee.elsdbexecute.IngredientHelper.DBExists(IngredientHelper.java:69)
        at com.dsallee.elsdbexecute.IngredientHelper.createDB(IngredientHelper.java:53)
        at com.dsallee.elsdbexecute.IngredientHelper.createDatabase(IngredientHelper.java:48)
        at com.dsallee.elsdbexecute.MainActivity.onCreate(MainActivity.java:34)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

06-15 21:04:52.941    3054-3054/? E/SqlHelper﹕ database not found

06-15 21:04:58.360    3054-3054/? E/SQLiteLog﹕ (26) file is encrypted or is not a database
06-15 21:04:58.360    3054-3054/? E/DefaultDatabaseErrorHandler﹕ Corruption reported by sqlite on database: /data/data/com.dsallee.elsdbexecute/databases/sqlite3.sql
06-15 21:04:58.360    3054-3054/? E/DefaultDatabaseErrorHandler﹕ deleting the database file: /data/data/com.dsallee.elsdbexecute/databases/sqlite3.sql
06-15 21:04:58.360    3054-3054/? E/SQLiteLog﹕ (14) cannot open file at line 31278 of [2ef4f3a5b1]
06-15 21:04:58.360    3054-3054/? E/SQLiteLog﹕ (14) os_unix.c:31278: (2) open(/data/data/com.dsallee.elsdbexecute/databases/sqlite3.sql) -
06-15 21:04:58.360    3054-3054/? E/SQLiteDatabase﹕ Failed to open database '/data/data/com.dsallee.elsdbexecute/databases/sqlite3.sql'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
        at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
        at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
        at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
        at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
        at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
        at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:794)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
        at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
        at com.dsallee.elsdbexecute.IngredientHelper.openDatabase(IngredientHelper.java:121)
        at com.dsallee.elsdbexecute.MainActivity.onCreate(MainActivity.java:35)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

06-15 21:04:58.360    3054-3054/? E/Error﹕ Error in codeandroid.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

主要活动

public class MainActivity extends Activity {

private IngredientHelper dbIngredientHelper = null;
private Cursor ourCursor = null;
private IngredientAdapter adapter = null;
private CursorAdapter CursorAdapter = null;

@Override
public void onCreate(Bundle savedInstanceState) {

    try {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ListView myListView = (ListView) findViewById(R.id.myListView);


        dbIngredientHelper = new IngredientHelper(this); // initializes helper
        dbIngredientHelper.createDatabase();
        dbIngredientHelper.openDatabase();

        ourCursor = dbIngredientHelper.getCursor();
        startManagingCursor(ourCursor);

        adapter = new IngredientAdapter(ourCursor);

        myListView.setAdapter(adapter);
    } catch (Exception e) {

        Log.e("Error", "Error in code" + e.toString());
        e.printStackTrace();
    }
}


class IngredientAdapter extends CursorAdapter {
    IngredientAdapter(Cursor c) {
        super(MainActivity.this, c);
    }

    @Override
    public void bindView(View row, Context ctxt,
                         Cursor c) {
        IngredientHolder holder = (IngredientHolder) row.getTag();
        holder.populateFrom(c, dbIngredientHelper);
    }

    @Override
    public View newView(Context ctxt, Cursor c,
                        ViewGroup parent) {
        LayoutInflater inflater = getLayoutInflater();
        View row = inflater.inflate(R.layout.row, parent, false);
        IngredientHolder holder = new IngredientHolder(row);
        row.setTag(holder);
        return (row);
    }
}

static class IngredientHolder {
    private TextView note = null;

    IngredientHolder(View row) {
        note = (TextView)row.findViewById(R.id.noteText);
    }

    void populateFrom(Cursor c, IngredientHelper r) {
        note.setText(r.getName(c));

    }
}
}

成分助手

class IngredientHelper extends SQLiteOpenHelper {

private static final String DATABASE_PATH = "/data/data/com.dsallee.elsdbexecute/databases/";
private static final String DATABASE_NAME = "redo.sql";
private static final int SCHEMA_VERSION = 1;

public static final String TABLE_NAME = "ELS";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TITLE = "number";

public SQLiteDatabase dbSqlite;

private final Context myContext;
public IngredientHelper(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
    this.myContext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {

}

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

}

public void createDatabase() {
    createDB();
}

private void createDB() {

    boolean dbExist = DBExists();

    if (!dbExist) {

        this.getReadableDatabase();
        copyDBFromResource();

    }
}

private boolean DBExists() {

    SQLiteDatabase db = null;

    try {
        String databasePath = DATABASE_PATH + DATABASE_NAME;
        db = SQLiteDatabase.openDatabase(databasePath, null,
                SQLiteDatabase.OPEN_READWRITE);
        db.setLocale(Locale.getDefault());
        db.setLockingEnabled(true);
        db.setVersion(1);

    } catch (SQLiteException e) {

        Log.e("SqlHelper", "database not found");

    }

    if (db != null) {
        db.close();

    }

    return db != null ? true : false;
}

private void copyDBFromResource() {
    InputStream inputStream = null;
    OutputStream outStream = null;
    String dbFilePath = DATABASE_PATH + DATABASE_NAME;

    try {

        inputStream = myContext.getAssets().open(DATABASE_NAME);

        outStream = new FileOutputStream(dbFilePath);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);
        }

        outStream.flush();
        outStream.close();
        inputStream.close();

    } catch (IOException e) {

        throw new Error("Problem copying database from resource file.");

    }

}

public void openDatabase() throws SQLException {

    String myPath = DATABASE_PATH + DATABASE_NAME;
    dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READWRITE);

}

@Override
public synchronized void close() {

    if (dbSqlite != null) {
        dbSqlite.close();
    }
    super.close();
}


public Cursor getCursor() {

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(TABLE_NAME);
    String[] asColumnsToReturn = new String[]{COLUMN_ID, COLUMN_TITLE};

    Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null,
            null, null, null, null);

    // ACTUAL TABLE QUERY ABOVE
    // COLUMNS TO RETURN IS COLUMNS TO BE DISPLAYED IN THE LISTVIEW

    return mCursor;
}

public String getName(Cursor c) {
    return (c.getString(1));
    // GET COLUMN INDEX 1 FROM ASCOLUMNSTORETURN
}
}

1 个答案:

答案 0 :(得分:1)

因为我的旧数据库没有加密所以我应该在这种情况下设置密码 SQLCipher for Android可以使用""打开未加密的数据库。作为密码。

我尝试过在密码字符串中传递null,也使用""但没有运气 然后:

您的代码中有错误,或者 数据库已使用其他密码加密,或 数据库已损坏。