با سلام و خسته نباشید مدتی بدلیل فرارسیدن ایام مبارک امتحانات و درگیر مسائل شخصی بودن نبودم
تو پست می خوام اموزش کتابخونه sqlCipher رو خدمت شما عزیزان ارائه بدم امیدوارم بتونم کمکتون کرده باشم
این روز ها خیلی ها با یک کلیک راس ساده و خارج کردن فایل ای پی کا برنامه به منابعی از جمله (عکس ، فونت ، دیتابیس و ... دسترسی داشته باشند و خیلی راحت از اون ها استفاده کنند و هم چنین شاید ما بخوایم اطلاعات مهمی رو در دیتابیس ذخیره کنیم که بازم در خطر هست در حالت عادی
به همین دلیل یه عزیزانی اومدن لطف کردن و کتابخونه sqlCipher رو واسه ما ارائه دادن که می تونیم با کمک اون دیتابیس خودمون رو امن کنیم و به اون پس ورد بدیم
خب چجوری ابتدا باید کتاخونه اونو به گریدلمون اد کنید این خط کد رو به گریدل اپمون اضافه می کنیم و میزنیم سینک شه(دقت کنید فیلتر شکنتون طبق معمول فعال باشه)
implementation 'net.zetetic:android-database-sqlcipher:3.3.1-2@aar'
خب وقتی سینک انجام شد حالا می ریم سراغ پیاده سازی دیتابیس
یک کلاس من ساختم به اسم MyDatabase و اکستند شده از SQLiteOpenHelper مانند زیر:
public class MyDatabase extends SQLiteOpenHelper
دقت کنید که از این پکیج ایمپورت شده باشه کلاسه SQLiteOpenHelper :
import net.sqlcipher.database.SQLiteOpenHelper;
خب اولین سازنده این کلاس رو آورراید می کنیم و با اعمال تغیرات لازم به این شکل می نویسیمش و متد های ان کریت و ان اپدیت رو هم اورراید می کنیم
public MyDatabase(Context context){
super(context,DB_NAME, null, DB_VERSION); SQLiteDatabase.loadLibs(context);
}-
نکته: دقت داشته باشید در سازنده بالا حتما و حتما این خط کد رو اضافه کنید ;;; ;(SQLiteDatabase.loadLibs(context
و در ادامه کوئری مربوط به ساخت جدول رو می نویسیید و اونو در متد ان کریت میسازیدش
و به جایه مهمه پستمون رسیدیم حالا برای نوشتن و خواندن باید اینگونه استفاده کنیم
public List<Model> get() {
db =getReadableDatabase(DB_PASS);
List<Model> allData = new ArrayList<>();
Cursor cursor = db.rawQuery("SELECT * FROM "+TABLE_NAME,null);
Toast.makeText(context, cursor.getColumnCount()+"", Toast.LENGTH_SHORT).show();
if (cursor.moveToFirst()){
do {
Model userModel = new Model();
userModel.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
userModel.setTxt(cursor.getString(cursor.getColumnIndex(COLUMN_TEXT)));
allData.add(userModel);
}while (cursor.moveToNext());
}
return allData;
}
این کد دقیقا عین حالت های عادی هست بغیر از این خط کد getReadableDatabase(DB_PASS); که ما باید برایه خواندن و نوشتن در دیتابیس پسورد خودمون رو وارد کنیم
کلاسی که من واسه تست درش از این کتابخونه استفاده کردم این هست امیدوارم مفید باشه براتون فایل کلاس رو هم پایین ضمیمه می کنم یا علی
package com.example.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
public class MyDatabase extends SQLiteOpenHelper implements MethodsDatabase<Model> {
private static final String DB_NAME = "test.db";
private static final int DB_VERSION = 1;
private static final String TABLE_NAME = "test";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_TEXT = "phone";
private static final String SQL = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+ " ( " +
"id INTEGER," +
"name TEXT," +
"phone TEXT);";
private static final String DB_PASS ="milad" ;
SQLiteDatabase db;
private Context context;
public MyDatabase(Context context) {
super(context,DB_NAME, null, DB_VERSION);
this.context = context;
SQLiteDatabase.loadLibs(context);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(SQL);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
@Override
public Model get(int id) {
db = getReadableDatabase(DB_PASS);
Cursor cursor = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE id = '"+id+"'",null);
Model model = new Model();
if (cursor.moveToFirst()) {
model.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
model.setTxt(cursor.getString(cursor.getColumnIndex(COLUMN_TEXT)));
}
return model;
}
@Override
public List<Model> get() {
db =getReadableDatabase(DB_PASS);
List<Model> allData = new ArrayList<>();
Cursor cursor = db.rawQuery("SELECT * FROM "+TABLE_NAME,null);
Toast.makeText(context, cursor.getColumnCount()+"", Toast.LENGTH_SHORT).show();
if (cursor.moveToFirst()){
do {
Model userModel = new Model();
userModel.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
userModel.setTxt(cursor.getString(cursor.getColumnIndex(COLUMN_TEXT)));
allData.add(userModel);
}while (cursor.moveToNext());
}
return allData;
}
@Override
public void insert(Model model) {
db =getWritableDatabase(DB_PASS);
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME,model.getName());
contentValues.put(COLUMN_TEXT,model.getTxt());
db.insert(TABLE_NAME,null,contentValues);
}
@Override
public void insert(List<Model> listitems) {
for (int i = 0; i < listitems.size(); i++) {
new InsertAsynckTasck(listitems.get(i)).execute();
}
}
@Override
public void update(int id,Model model) {
db = getWritableDatabase(DB_PASS);
ContentValues values = new ContentValues();
values.put(COLUMN_NAME,model.getName());
values.put(COLUMN_TEXT,model.getTxt());
db.update(TABLE_NAME,values,"id = "+id,null);
}
@Override
public void delete(int id) {
db = getWritableDatabase(DB_PASS);
db.delete(TABLE_NAME,"id = "+id,null);
}
class InsertAsynckTasck extends AsyncTask {
private Model userModel;
public InsertAsynckTasck(Model userModel) {
this.userModel = userModel;
}
@Override
protected Object doInBackground(Object[] objects) {
SQLiteDatabase db =getWritableDatabase(DB_PASS);
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_NAME,userModel.getName());
contentValues.put(COLUMN_TEXT,userModel.getTxt());
db.insert(TABLE_NAME,null,contentValues);
return null;
}
}
}