Reputation: 1
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