آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

وقتی دیتا بیس جدید رو می ریزم آپدیت نمی شه

ali_jaha  9 سال پیش  9 سال پیش
0 0

با عرض سلام و خسته نباشید خدمت تمامی اساتید.

من یک مشکل در رابطه با دیتا بیس دارم و اونم اینکه کاربر وقتی مثلا برنامم رو نصب کرد .

اگر برنامم رو آپدیت کنم و دیتا بیس رو مثلا محتواش رو کم یا بیشتر کنم اگه طرف آپدیت کنه برنامم رو نمی افته روش .

برای استفاده باید بره از تو تنظیمات دیتا بیس رو پاک کنه و از نو برنامه رو نصب کنه .

(((((((((((می خوام این اطفاق نیفته و دیتا بیس جدید بیفته رو دیتا بیس قدیمی و آپدیت شه ))))))))

چگونه این کار رو عملی کنم ؟

ممنون می شم کمک کنید . اگر هم منت به سر ما گذاشته و جواب دادید لطفا در مورد کد هم کمی توضیح بدید که چیه و چه کار باید انجام بدم

ممنون :X

+1 0
سلام چند تا راه وجود داره : 1) موقع نصب برنامه جدید یه کدی بنویسی که اگه کاربر دیتابیس قبلی رو تویه گوشی خودش داشت اون رو حذف کنه دیتابیس جدید رو کپی کنه . 2) موقع uninstall شدن برنامه دیتابیس رو از روی گوشی حذف کنه (با یه سرچ تویه انجمن جواب رو پیدا میکنی) 3) یه راه راحت اینه که اسم دیتابیس جدید رو با قبلی یکی نزاری یه اسم جدید بزار برا دیتابیس . (9 سال پیش)
+1 0
روش 1 رو می شه توضیح بدیید (9 سال پیش)
+1 0
شما آدرس فایل ذخیره شده ی دیتابیس رو دارید میتونید بگید اگه تویه این پوشه فلان دیتابیس بود اون رو حذف کن . بخش 19 کتابخانه کپی فایل. (9 سال پیش)
0 0
این دیتا بیس من هست در پاسخ این پست اضافه کردم می شه بگید تو اون چی رو اضافه کنم ؟ (9 سال پیش)
+1 0
شما چرا on create و on opgrade کلاستون خالیه؟ دیتا بیس رو از اسست خوندی؟ (9 سال پیش)
0 0
بله از assest خوندم (9 سال پیش)
0 0
بله از assest خوندم ر (9 سال پیش)
0 0
از این کتابخانه استفاده کنید، فقط کافیه ورژن دیتابیس رو ببرید بالا لینک (9 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
ali_jaha  9 سال پیش
0 0

  • package com.farshelli.job;

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;


    public class database extends SQLiteOpenHelper {

    public final String path = "data/data/com.farshelli.job/databases/";
    public final String Name = "database";
    public SQLiteDatabase mydb;

    private final Context mycontext;


    public database(Context context) {
    super(context, "database", null, 2);
    mycontext = context;

    }


    @Override
    public void onCreate(SQLiteDatabase arg0) {
    // TODO Auto-generated method stub

    }


    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

    }


    public void useable() {

    boolean checkdb = checkdb();

    if (checkdb) {

    } else {

    this.getReadableDatabase();

    try {
    copydatabase();
    }
    catch (IOException e) {}

    }

    }


    public void open() {

    mydb = SQLiteDatabase.openDatabase(path + Name, null, SQLiteDatabase.OPEN_READWRITE);

    }


    public void close() {
    mydb.close();
    }


    public boolean checkdb() {

    SQLiteDatabase db = null;
    try {
    db = SQLiteDatabase.openDatabase(path + Name, null, SQLiteDatabase.OPEN_READONLY);
    }
    catch (SQLException e)
    {

    }
    //mydb.close();
    return db != null ? true : false;

    }


    public void copydatabase() throws IOException {
    OutputStream myOutput = new FileOutputStream(path + Name);
    byte[] buffer = new byte[1024];
    int length;
    InputStream myInput = mycontext.getAssets().open(Name);
    while ((length = myInput.read(buffer)) > 0) {
    myOutput.write(buffer, 0, length);
    }
    myInput.close();
    myOutput.flush();
    myOutput.close();
    }


    public String Display(int row, int field, String table) {

    Cursor cu = mydb.rawQuery("select * from " + table, null);
    cu.moveToPosition(row);
    String s = cu.getString(field);
    return s;
    }


    public Integer count(String table, String field) {

    Cursor cu = mydb.rawQuery("select * from " + table + " group by " + field, null);
    int s = cu.getCount();
    return s;
    }


    public String Season_display(String table, int row) {

    Cursor cu = mydb.rawQuery("select * from " + table + " group by Seasone", null);
    cu.moveToPosition(row);
    String s = cu.getString(4);
    return s;
    }


    public Integer Story_count(String table, String sea) {

    Cursor cu = mydb.rawQuery("select * from " + table + " where Seasone='" + sea + "' group by Name", null);
    int s = cu.getCount();
    return s;
    }


    public String Story_display(String table, int row, String sea, int field) {

    Cursor cu = mydb.rawQuery("select * from " + table + " where Seasone='" + sea + "' group by Name", null);
    cu.moveToPosition(row);
    String s = cu.getString(field);
    return s;
    }


    public Integer Story_page_count(String table, String sea, String story) {

    Cursor cu = mydb.rawQuery("select * from " + table + " where Seasone='" + sea + "' and Name='" + story + "'", null);
    int s = cu.getCount();
    return s;
    }


    public String main_display(String table, String sea, String name, String page) {

    Cursor cu = mydb.rawQuery("select * from " + table + " where Seasone='" + sea + "' and Name='" + name + "' and Page=" + page, null);
    cu.moveToFirst();
    String s = cu.getString(2);
    return s;
    }

    }
0 0
از دوستان می شه کمک کنن . ممنون میشم :X (9 سال پیش)
پاسخ به سوال 
ali_jaha  9 سال پیش
0 0

دوستان لطفا کمکم کنین :(

الان دو هفتس لنگه اینم  . اصلا نمی تونم رفعش کنم .

از اساتیدو دوستان خوبم هر کی بلده لطفا کمک کنه

پاسخ به سوال 
ab  9 سال پیش
+1 0

یه شرط بذار که چک کنه فایل تو فلان پوشه وجود داره یا نه، اگر وجود داشت حذفش کنه. اینو می تونی توی کلاس G (اگر اینچنین کلاسی نوشتی) یا ابتدای شروع برنامه بذاری و طوری تنظیمش کنه که فقط برای اولین اجرا اینو چک کنه.

 

 File  f  = new File(G.DIR_DATABASE + filename);
if (f.exists){
f.delete();
}
پاسخ به سوال 
sami  9 سال پیش
+3 0

سلام.

شما از همون ابتدا باید متد onUpgrade رو پیاده سازی می کردین.حالا چون این کارو نکردین،خودتون باید یه فکری به حال کنترل ورژن دیتابیس بکنید.

توی کد زیر،من این مشکل رو براتون حل کردم.یعنی از این به بعد هر وقت خواستین نرم افزارتون رو آپدیت کنید،(البته فقط هر وقت خواستین دیتابیستون رو آپدیت کنید این کارو بکنید)کافیه مقدار متغیر new_database_verdsion رو یک واحد افزایش بدین تا دیتابیس جدید کپی بشه.

من کدی که خودتون گذاشتین رو تغییر دادم تا مشکلتون حل بشه.

بجای متد useable که خودتون نوشتین،متد زیر رو جایگزین کنید.(بهتره کد رو کپی کنید...).

 

 public void useable() {

    SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mycontext);
	final int new_database_verdsion = 1;
	final int old_database_verdsion = mSharedPreferences .getInt("database_version", 0);  


        boolean checkdb = checkdb();
        if (!checkdb || new_database_verdsion > old_database_verdsion ) {
		this.getReadableDatabase();
                try {
                copydatabase();
				
			Editor editor = mSharedPreferences.edit();
			editor.putInt("database_version", new_database_verdsion);
			editor.commit();
	              }
            catch (IOException e) {}
        } 

    }
 
 
 

 

 

0 0
ممنونم بابت پاسختون دوست عزیزم . ببخشید به جای اون myapp که نوشتید جه جیزی باید بزاریم ؟؟؟ (9 سال پیش)
0 0
خواهش می کنم.کد رو اصلاح کردم.دفعه اول با خودم گفتم شاید برای خوندن تنظیمات،متغیر استاتیک توی کلاس G (یا همون MyApp که من نوشته بودم،)تعریف کرده باشین،بخاطر همین کد رو اول با در نظر گرفتن این فرض نوشته بودم.اما دوباره عوضش کردم که بطور مستقل کار کنه،ولی متاسفانه یادم رفته بود اون قسمتشو هم تغییر بدم. (9 سال پیش)
0 0
ممنونم گلم اما بازم کار نکرد :( (9 سال پیش)
0 0
آره،درسته،شرط رو اشتباه نوشتم،تو کد شما باید بجای And از OR استفاده کرد.کد رو اصلاح کردم.من صرفا دارم مشکل شمارو حل می کنم و این جواب فقط راه حلی برای استفاده نادرست شما از نحوه پیاده سازی دیتابیسه. (9 سال پیش)
0 0
منظورم از کامنت قبلی این بود که دیگه از این کلاس برای نرم افزارای آیندتون استفاده نکنید.(یه بار دیگه تست کنید،فقط یادتون نره که باید مقدار اون متغیر رو افزایش بدین ). (9 سال پیش)
0 0
wowwww درست شد خیلی ممنونم عزیزمممممممممم :** 2 هفته بود لنگه این بودم.یک دنیا ازت ممنونم . انشالله روزی بتونم واست جبران کنم (9 سال پیش)
0 0
خواهش می کنم رفیق.نیازی به جبران نیست :) فقط هر وقت تونستید به بقیه دوستان کمک کنید.به هرحال همین الانشم دوستانی هستن که ممکنه شما بتونید سوالاشونو جواب بدین.اگه به همچین موردی برخوردین،لطفا شما هم به اون شخص کمک کنید... و سعی کنید قبل از کپی کردن هر کدی توی پروژتون،اول اون کد رو آنالیز کنید و خوب درکش کنید و بعد ازش استفاده کنید و تا میتونید دانش برنامه نویسیتون رو افزایش بدین تا بتونید هر کدی که به دستتون میرسه رو اول خوب درکش کنید و بعد در صورت نیاز براحتی تغییرش بدین (9 سال پیش)
0 0
چشم :* (9 سال پیش)
0 0
آقا ممنو منم همین مشکلو داشتم ونمیدونستم باید تو متد onUpgrade رو از اولکار پیاده سازی میکردم ولی با این کد شما مشکلم حل شد فقط یه سوال. متد onUpgrade رو باید چطوری پیاده سازی کنیم که این مشکل به وجود نیاد؟ (9 سال پیش)
+1 0
خب این متد همونطور که از اسمش پیداست،قراره دیتابیس رو آپدیت کنه وقتی که قراره دیتابیس رو تغییر بدین(از نظر محتوا و یا ساختار) ،این متد بصورت خودکار فراخوانی میشه،البته به شرطی که یه فیلد ورژن برای دیتابیستون درنظر بگیرین و اونو که یه عدد صحیح هستش رو به عنوان آرگومان سوم متد onUpgrade ارسال کنید و بعدا هر وقت خواستین دیتابیس رو تغییر بدین،می تونید مقدار این فیلد رو یه واحد افزایش بدین تا دیتابیس آپدیت بشه. (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .