کلیدستان

نسخه‌ی کامل: دیتابیس برنامه اندروید پرمحتوا
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان
در حال ساخت برنامه ای هستم که تقریبا 50 هزار مطلب داره ، میخواستم بدونم به نظر شما از چه روشی برای ذخیره سازی اطلاعات در sqlite استفاده کنم

در حال حاظر یک دیتابیسی داخلی درست کردم که مطالب را بوسیلی Pull Parser از یک تکست ویو را در دیتا بیس قرار میده
آیا سرعت برنامه پایین میاید ؟
روش بهتری سراغ دارید؟
در جست و جو مطالب امکان دارد مشکل بوجود بیاد؟
باتشکر
سلام:
به نظر من اگر از دیتابیس خارجی استفاده کنی ، مدیریت آن راحت تر است  . دیتابیس خودت رو با یک برنامه مثل 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(contextDB_NAMEnull1);

        
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(myPathnullSQLiteDatabase.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(buffer0length);

        
    }


    
myOutput.flush();
    
myOutput.close();
    
myInput.close();


        }


    
        public 
void openDataBase() throws SQLException{
            
String myPath DB_PATH DB_NAME;
            
myDataBase SQLiteDatabase.openDatabase(myPathnullSQLiteDatabase.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 dbint oldVersionint 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 استفاده کردم که بهتر شد (راه حل بهتر این بود که متن ها ی بزرگ را داخل چند سطر می نوشتم )
(۱۳۹۴/۰۵/۲۵, ۱۲:۲۵ ب.ظ)'hamidrezass' نوشته: [ -> ]سلام:
به نظر من اگر از دیتابیس خارجی استفاده کنی ، مدیریت آن راحت تر است  . دیتابیس خودت رو با یک برنامه مثل 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(contextDB_NAMEnull1);

        
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(myPathnullSQLiteDatabase.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(buffer0length);

        
    }


    
myOutput.flush();
    
myOutput.close();
    
myInput.close();


        }


    
        public 
void openDataBase() throws SQLException{
            
String myPath DB_PATH DB_NAME;
            
myDataBase SQLiteDatabase.openDatabase(myPathnullSQLiteDatabase.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 dbint oldVersionint 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 استفاده کردم که بهتر شد (راه حل بهتر این بود که متن ها ی بزرگ را داخل چند سطر می نوشتم )

 

خیلی ممنون دوست عزیز
سلام.
در مورد آهسته شدن برنامه اندروید به دلیل بزرگ بودن پایگاه داده، باید تذکر بدهم که در صورتی با این مشکل مواجه می شوید که query فراخوانی اطلاعات از پایگاه داده را غلط بنویسید. معمولا برخی این اشتباه را می کنند که تمام یا بخش بزرگی از اطلاعات جدول (table) را با query فراخوانی کرده و بعد مثلا با یک حلقه for و شرط گذاری، بخشی از آن را در خروجی برنامه نمایش می دهند. همین حلقه for و شرط ها، برنامه اندروید را آهسته می کند. در صورتی که با نوشتن یک query مناسب، باید تنها ردیف های (rows) مورد نظرمان از جدول فراخوانی شود. اگر اینگونه عمل شود، با پایگاه های داده بزرگ، مشکلی نخواهید داشت.

(۱۳۹۴/۰۵/۲۵, ۰۱:۳۲ ب.ظ)'admin' نوشته: [ -> ]سلام.
در مورد آهسته شدن برنامه اندروید به دلیل بزرگ بودن پایگاه داده، باید تذکر بدهم که در صورتی با این مشکل مواجه می شوید که query فراخوانی اطلاعات از پایگاه داده را غلط بنویسید. معمولا برخی این اشتباه را می کنند که تمام یا بخش بزرگی از اطلاعات جدول (table) را با query فراخوانی کرده و بعد مثلا با یک حلقه for و شرط گذاری، بخشی از آن را در خروجی برنامه نمایش می دهند. همین حلقه for و شرط ها، برنامه اندروید را آهسته می کند. در صورتی که با نوشتن یک query مناسب، باید تنها ردیف های (rows) مورد نظرمان از جدول فراخوانی شود. اگر اینگونه عمل شود، با پایگاه های داده بزرگ، مشکلی نخواهید داشت.



 

خیلی ممنون از جوابتان ، چطوری باید فقط ردیف های مورد نظرمان فراخوان بکنیم ، میتوانید راهنمایی بفرمایید؟

 
(۱۳۹۴/۰۵/۲۸, ۰۷:۵۴ ب.ظ)'osam20' نوشته: [ -> ]خیلی ممنون از جوابتان ، چطوری باید فقط ردیف های مورد نظرمان فراخوان بکنیم ، میتوانید راهنمایی بفرمایید؟
 

منظور اینه که زمانی که شما نیاز دارید محتویات یک متن را به کاربر نمایش دهید که در یک سطر هست با شرطی که در خود select قرار می دهی فقط اون row را از دیتابیس بگیری (نه اینکه تمام یا بخش زیادی از دیتابیس را انتخاب کنی و بعد داخل برنامه شرط قرار دهی)
این درسته:

کد پی‌اچ‌پی:
mcursor=db.rawQuery("SELECT text FROM your_table  WHERE id="آی دی سطر یا سطر های مورد نظر", null); 

با دستور  زیر کل سطرها را انتخاب می کنیم و بعد برای گذاشتن داخل یک TextView احتمالا فقط یک سطر را نیاز داریم
درضمن اگر تمام فیلدهای یک سطر را نیاز نداری آن ها را هم فاکتور بگیر مثلا در select بالا فقط من فیلد text رو گرفتم که  داخل textview متن کلی از یک کتاب را نشان بدهم. و به فیلدهای دیگر نیاز نداشتم .

کد پی‌اچ‌پی:
mcursor=db.rawQuery("SELECT text FROM your_table, null); 
(۱۳۹۴/۰۵/۲۸, ۰۸:۴۹ ب.ظ)'hamidrezass' نوشته: [ -> ]منظور اینه که زمانی که شما نیاز دارید محتویات یک متن را به کاربر نمایش دهید که در یک سطر هست با شرطی که در خود select قرار می دهی فقط اون row را از دیتابیس بگیری (نه اینکه تمام یا بخش زیادی از دیتابیس را انتخاب کنی و بعد داخل برنامه شرط قرار دهی)
این درسته:
کد پی‌اچ‌پی:
mcursor=db.rawQuery("SELECT text FROM your_table  WHERE id="آی دی سطر یا سطر های مورد نظر", null); 
با دستور  زیر کل سطرها را انتخاب می کنیم و بعد برای گذاشتن داخل یک TextView احتمالا فقط یک سطر را نیاز داریم
درضمن اگر تمام فیلدهای یک سطر را نیاز نداری آن ها را هم فاکتور بگیر مثلا در select بالا فقط من فیلد text رو گرفتم که  داخل textview متن کلی از یک کتاب را نشان بدهم. و به فیلدهای دیگر نیاز نداشتم .
کد پی‌اچ‌پی:
mcursor=db.rawQuery("SELECT text FROM your_table, null); 

 

سپاسگزارم