SHRI Y.N.TANK
SHRI Y.N.TANK

Reputation: 1

Facing problem in implementation of SQLCipher

This are my project files AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="28"
       />
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.NewSQLCipher"
        tools:targetApi="31">
                <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

DBHelper.java

package com.example.newsqlcipher;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;

import net.zetetic.database.sqlcipher.SQLiteDatabase;
import net.zetetic.database.sqlcipher.SQLiteOpenHelper;

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

public class DBHelper extends SQLiteOpenHelper {
    private static DBHelper instance;
    Context c;
    private static final int DATABASE_VER=1;
    public static final String DATABASE_NAME="EDMT.db";
    public static final String TABLE_NAME="CONTACTS";
    public static final String COLUMN_EMAIL="EMAIL";
    private static final String SQL_CREATE_TABLE_QUERY="CREATE TABLE "+TABLE_NAME+" ("+COLUMN_EMAIL+" TEXT PRIMARY KEY)";
    private static final String SQL_DELETE_TABLE_QUERY="DROP TABLE IF EXISTS "+TABLE_NAME;
    public String dbpath;
    SQLiteDatabase myDB;
    public static final String PASS_PHARSE="!@#ABC";
    public DBHelper(Context context)
    {
        super(context,DATABASE_NAME,null,DATABASE_VER);
        c=context;
    }
    static public synchronized DBHelper getInstance(Context context)
    {
        if (instance == null)
        {
            instance = new DBHelper(context);
        }
        return instance;
    }
    public SQLiteDatabase getDataBase()
    {
        Log.e("testmsg","getDataBase called");
        if(myDB == null)
        {
            try{
                System.loadLibrary("sqlcipher");
                File databaseFile = c.getDatabasePath(DATABASE_NAME);
                databaseFile.mkdirs();
                myDB = SQLiteDatabase.openOrCreateDatabase(databaseFile,PASS_PHARSE,null,null,null);
                myDB.execSQL(SQL_CREATE_TABLE_QUERY);
            }
            catch (Exception e)
            {
                Log.e("err:"+c.toString(),e.getMessage());
                if(myDB != null)
                {
                    myDB.close();
                }
            }
        }
        return myDB;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.e("testmsg","onCreate db called");
        getDataBase();
        dbpath = String.valueOf(c.getDatabasePath(DATABASE_NAME));
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL(SQL_DELETE_TABLE_QUERY);
        onCreate(sqLiteDatabase);
    }
    public void insertNewEmail(String email) {
        SQLiteDatabase db = instance.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_EMAIL,email);
        db.insert(TABLE_NAME,null,values);
        db.close();
    }
    public List<String> getAllEmail()
    {
        Log.e("testmsg","getAllEmail called");
        SQLiteDatabase db = instance.getWritableDatabase();
        Cursor cursor = db.rawQuery(String.format("SELECT * FROM '%s';",TABLE_NAME),null);
        List<String> emails = new ArrayList<>();
        if (cursor.moveToFirst())
        {
            while(!cursor.isAfterLast())
            {
                String email = cursor.getString(0);
                emails.add(email);
                cursor.moveToNext();
            }
        }
        cursor.close();
        db.close();
        return emails;
    }

}

MainActivity.java

package com.example.newsqlcipher;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import net.zetetic.database.sqlcipher.SQLiteDatabase;

public class MainActivity extends AppCompatActivity {

    Button btnAdd,btnUpdate,btnDelete;
    EditText edtEmail;

    ListView lstEmails;
    String saveEmail="";
    DBHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        System.loadLibrary("sqlcipher");
        //SQLiteDatabase.loadLibs(this);
        dbHelper = new DBHelper(this);

        lstEmails = (ListView)findViewById(R.id.lstEmails);
        lstEmails.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String item = (String)lstEmails.getItemAtPosition(position);
                edtEmail.setText(item);
                saveEmail = item;
            }
        });

        edtEmail = (EditText)findViewById(R.id.edtEmail);
        btnAdd = (Button)findViewById(R.id.btnAdd);
        btnAdd.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                DBHelper.getInstance(MainActivity.this).insertNewEmail(edtEmail.getText().toString());
                reloadEmails();
                Toast.makeText(MainActivity.this, ""+dbHelper.dbpath, Toast.LENGTH_LONG).show();
            }
        });
        Log.e("testmsg","onCreate activity called");
        reloadEmails();
    }
    private void reloadEmails() {
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,android.R.id.text1,
                DBHelper.getInstance(this).getAllEmail());
        lstEmails.setAdapter(adapter);
    }
}

i am having this error while running this code

E/testmsg: onCreate activity called
E/testmsg: getAllEmail called
E/testmsg: onCreate db called
E/testmsg: getDataBase called
I/SQLiteConnection: Database keying operation returned:0
E/SQLiteLog: (5) database is locked in "SELECT COUNT(*) FROM sqlite_schema;"
E/SQLiteDatabase: Failed to open database '/data/user/0/com.example.newsqlcipher/databases/EDMT.db'.
    android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: SELECT COUNT(*) FROM sqlite_schema;

error1.jpgerror2.jpgerror3.jpg

above code is what i was trying to implement and attached photos shows error message. please help to solve this issue

Upvotes: 0

Views: 73

Answers (0)

Related Questions