انجمن سایت کلیدستان



دیتابیس برنامه اندروید پرمحتوازمان کنونی: ۱۳۹۵/۰۹/۱۹، ۰۴:۰۶ ب.ظ
کاربران در حال بازدید این موضوع: 1 مهمان
نویسنده: osam20
آخرین ارسال: osam20
پاسخ 7
بازدید 1887

رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
دیتابیس برنامه اندروید پرمحتوا

دیتابیس برنامه اندروید پرمحتوا

#1
سلام دوستان
در حال ساخت برنامه ای هستم که تقریبا 50 هزار مطلب داره ، میخواستم بدونم به نظر شما از چه روشی برای ذخیره سازی اطلاعات در sqlite استفاده کنم

در حال حاظر یک دیتابیسی داخلی درست کردم که مطالب را بوسیلی Pull Parser از یک تکست ویو را در دیتا بیس قرار میده
آیا سرعت برنامه پایین میاید ؟
روش بهتری سراغ دارید؟
در جست و جو مطالب امکان دارد مشکل بوجود بیاد؟
باتشکر
پاسخ

دیتابیس برنامه اندروید پرمحتوا

#2
سلام:
به نظر من اگر از دیتابیس خارجی استفاده کنی ، مدیریت آن راحت تر است  . دیتابیس خودت رو با یک برنامه مثل 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 استفاده کردم که بهتر شد (راه حل بهتر این بود که متن ها ی بزرگ را داخل چند سطر می نوشتم )
پاسخ
 سپاس شده توسط osam20 ، admin

دیتابیس برنامه اندروید پرمحتوا

#3
(۱۳۹۴/۰۵/۲۵, ۱۲:۲۵ ب.ظ)'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 استفاده کردم که بهتر شد (راه حل بهتر این بود که متن ها ی بزرگ را داخل چند سطر می نوشتم )

 

خیلی ممنون دوست عزیز
پاسخ

دیتابیس برنامه اندروید پرمحتوا

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

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط osam20

دیتابیس برنامه اندروید پرمحتوا

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



 

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

 
پاسخ

دیتابیس برنامه اندروید پرمحتوا

#6
(۱۳۹۴/۰۵/۲۸, ۰۷:۵۴ ب.ظ)'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); 
پاسخ
 سپاس شده توسط osam20 ، admin

دیتابیس برنامه اندروید پرمحتوا

#7
(۱۳۹۴/۰۵/۲۸, ۰۸:۴۹ ب.ظ)'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); 

 

سپاسگزارم 
پاسخ


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

آخرین کلیدهای غیررایگان

شما هم می توانید کلیدهای غیررایگان منتشر کنید (بیشتر بدانید)