سلام:
به نظر من اگر از دیتابیس خارجی استفاده کنی ، مدیریت آن راحت تر است . دیتابیس خودت رو با یک برنامه مثل sqlite manager که add on فایرفاکس هست بساز و آن را در پوشه assets قرار بده . و کلاس زیر را استفاده کن :
بعد در هر اکتیویتی باید کد زیر را بنویسی تا به دیتابیس دسترسی داشته باشی و بتونی read , write کنی:
در مورد جستجوی مطالب فکر نمی کنم اگر بتونی select مناسب رو انجام بدی مشکلی وجود داشته باشد اما یه نکته مهمتر که من خودم هم با او مشکل داشتم اینه که بعد از اینکه select رو انجام می دادم چون متن خیلی خیلی برای sqlite بزرگ بود و اینکه cpu گوشی محدود میباشد(متن بعضی از سطرهای من به 49هزار کاراکتر میرسید). هنگام نشاندن در textview یه مقدار کند بود که از کلاس Asynctask استفاده کردم که بهتر شد (راه حل بهتر این بود که متن ها ی بزرگ را داخل چند سطر می نوشتم )
به نظر من اگر از دیتابیس خارجی استفاده کنی ، مدیریت آن راحت تر است . دیتابیس خودت رو با یک برنامه مثل sqlite manager که add on فایرفاکس هست بساز و آن را در پوشه assets قرار بده . و کلاس زیر را استفاده کن :
کد پیاچپی:
public class DataBaseHelper extends SQLiteOpenHelper{
private static String DB_PATH = "/data/data/com.example.nahj_multi_languages/databases/"; //فقط اسم پکیج برنامه خودت رو عوض کن
private static String DB_NAME = "hekmatha.sqlite"; //اسم دیتابیس خودت
private SQLiteDatabase myDataBase;
private final Context myContext;
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
}
else{
this.getReadableDatabase();
try {
copyDataBase();
}
catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
@Override
public synchronized SQLiteDatabase getReadableDatabase() {
return super.getReadableDatabase();
}
private void copyDataBase() throws IOException{
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY|SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}
@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
بعد در هر اکتیویتی باید کد زیر را بنویسی تا به دیتابیس دسترسی داشته باشی و بتونی read , write کنی:
کد پیاچپی:
DataBaseHelper mydatabasehelper=new DataBaseHelper(getActivity().getApplicationContext());
mydatabasehelper=new DataBaseHelper(getActivity());
try {
mydatabasehelper.createDataBase();
}
catch (IOException ioe) {
throw new Error("Unable to create database");
}
try {
mydatabasehelper.openDataBase();
}
catch (SQLException sqle) {
sqle.printStackTrace();
}
db=mydatabasehelper.getReadableDatabase();
mcursor=db.rawQuery("SELECT text FROM "+zaban+" WHERE id="+id+"", null);
mcursor.moveToFirst();
mytext.setText(mcursor.getString(0));
در مورد جستجوی مطالب فکر نمی کنم اگر بتونی select مناسب رو انجام بدی مشکلی وجود داشته باشد اما یه نکته مهمتر که من خودم هم با او مشکل داشتم اینه که بعد از اینکه select رو انجام می دادم چون متن خیلی خیلی برای sqlite بزرگ بود و اینکه cpu گوشی محدود میباشد(متن بعضی از سطرهای من به 49هزار کاراکتر میرسید). هنگام نشاندن در textview یه مقدار کند بود که از کلاس Asynctask استفاده کردم که بهتر شد (راه حل بهتر این بود که متن ها ی بزرگ را داخل چند سطر می نوشتم )