تمام سوالات سوالات بدون پاسخ سوال بپرسید

با سلام و خسته نباشید

من با استفاده از این آموزش http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ از دیتابیس از پیش ساخته شده در نرم افزارم استفاده می کنم و به خوبی کار می کند ولی زمانی که اطلاعات جدید به دیتابیس اضافه می کنم و نرم افزار رو آپدیت می کنم بعد از نصب دوباره نرم افزار ( replace ) اطلاعات دیتابیس بروز نمی شود و باید حتما نرم افزار قبلی حذف شود و دوباره نصب شود تا اطلاعات جدید دیتابیس بر روی گوشی کپی بشود . حالا من می خواهم با همان نصب دوباره ( repalce ) اطلاعات جدید دیتابیس کپی شود . با تشکر پیشاپیش از همه دوستان

2

من با کلیک روی لینکی که گداشته اید با "Nothing found for blog Usin..." روبرو شدم!

(18 ژانویه '13, 17:19) Android clas...

با تشکر اصلاح شد . البته من فکری کردم انکه می توانم در بروز رسانی های بعد اسم دیتابیس رو عوض کنم که دیتابیس آپدیت بشود راهی غیر از این باشه

(18 ژانویه '13, 17:33) sajad
2 پاسخ

در اندروید،زمانی که یک برنامه بروز رسانی می شود،بعضی از اطلاعاتی که توسط برنامه به روی دستگاه نوشته شده اند،باقی می مانند؛به عنوان مثال می توان به بانک های اطلاعاتی اشاره کرد که توسط برنامه ایجاد می شوند.در کدی که شما از آن استفاده کرده اید،در زمان اجرا ابتدا بررسی می شود که آیا بانک اطلاعاتی با نام مورد نظر موجود است یا نه؟ و در صورت عدم وجود،بانک اطلاعاتی را از assets در محل مورد نظر کپی می کند.اما اگر برنامه از قبل روی گوشی نصب شده باشد،در هنگام به روز رسانی اطلاعات بانک حذف نمی شود و در نتیجه کپی از بانک موجود در assests از برنامه بروز کننده،توسط آن در دستگاه ایجاد نمی شود و بانک اطلاعاتی که توسط برنامه قبلی ایجاد و دستکاری شده،به جای خود باقی می ماند.اما در زمانی که برنامه قبل از بروز رسانی حذف شود،بانک اطلاعات متعلق به آن هم حذف می شود،بنابراین با نصب برنامه جدید بانک موجود در assets آن،در دستگاه کپی می شود.

برای حل مشکلتان می توانید قسمتی از برنامه را که به بررسی وجود بانک اطلاعات از قبل در مسیر مورد نظر می پردازد،حذف کنید.در این صورت برنامه جدید بدون توجه به وجود بانک قبلی،در زمان اجرا بانک موجود در assets خود را در دستگاه کپی می کند.یعنی باید این قسمت از برنامه را :

public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();

    if(dbExist){
        //do nothing - database already exist
    }else{

        //By calling this method and empty database will be created into the default system path
        //of your application so we are gonna be able to overwrite that database with our database.
        this.getReadableDatabase();

        try {

            copyDataBase();

        } catch (IOException e) {

            throw new Error("Error copying database");

        }
    }

}

به شکل زیر تغییر دهید:

public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();

    //By calling this method and empty database will be created into the default system path
    //of your application so we are gonna be able to overwrite that database with our database.
    this.getReadableDatabase();

    try {

        copyDataBase();

    } catch (IOException e) {

        throw new Error("Error copying database");

    }

}

با کمال تشکر از شما که وقتتون رو برای پاسخ به من گذاشتید در خصوص پاسختون درسته حتی من کد ها رو حذف کرده بودم ولی دیدم هر دفعه که برنامه اجرا میشه دیتابیس کپی می شود که فکر می کنم در برنامه زیاد خوب نباشه ؟ آیا به نظر شما مشکلی پیش نمی آید !

(18 ژانویه '13, 23:16) sajad

sajad@ ممکن است بگویید که چرا می خواهید با بروز رسانی،بانک اطلاعاتی دوباره به حالت اول برگردد؟

(18 ژانویه '13, 23:21) hasanghaforian

خیر نمی خواهم به حالت اول باز کرده مثلا من یک کتاب دارم که می خواهم با بروزرسانی اطلاعات جدید به اون اضافه بشه که البته راهش رو پیدا کردم اینجا می گذارم تا دوستان هم استفاده کنند با کمال تشکر از کمک های شما

(19 ژانویه '13, 21:10) sajad

از این کد ها به جای SQLiteOpenHelper استفاده می کنیم و هر بار که دیتابیس رو آپدیت می کنیم مقدار DB_VERS افزایش می دهیم مثل 1 یا 2 ... کد زیر :

import java.io.FileOutputStream;

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;

public class DataBaseHelper extends SQLiteOpenHelper {

// The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.example/databases/";
private static String DB_NAME = "eventsdb";
public static final int DB_VERS = 7;
private SQLiteDatabase myDataBase;
private final Context myContext;
private static String TAG = "DataBaseHelper";

/**
 * Constructor Takes and keeps a reference of the passed context in order to
 * access to the application assets and resources.
 * 
 * @param context
 */
public DataBaseHelper(Context context) {
    super(context, DB_NAME, null, DB_VERS);
    this.myContext = context;
}

/**
 * Creates an empty database on the system and rewrites it with your own
 * database.
 * */
public boolean createDataBase() throws IOException {
    boolean dbExist = checkDataBase();

    if (dbExist) {
        Log.d(TAG, "database already exist");

        //Running this method causes SQLite class checking for if New DB Version Exists and runs upgrade method
        getReadableDatabase();
        close();

        return true;
    } 
    else {
        // By calling this method and empty database will be created into
        // the default system path
        // of your application so we are gonna be able to overwrite that
        // database with our database.
        this.getReadableDatabase();
        try {
            copyDataBase();
        } 
        catch (IOException e) {
            throw new Error("Error copying database");
        }
        return false;
    }
}

/**
 * Check if the database already exist to avoid re-copying the file each
 * time you open the application.
 * 
 * @return true if it exists, false if it doesn't
 */
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;
}

/**
 * Copies your database from your local assets-folder to the just created
 * empty database in the system folder, from where it can be accessed and
 * handled. This is done by transferring bytestream.
 * */
private void copyDataBase() throws IOException {
    // Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);
    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;
    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);
    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

public void openDataBase() throws SQLException {
    // Open the database
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READONLY);
}

@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) {
    Log.d(TAG, "UPGRADING Database...");
    try {
        copyDataBase();
    } 
    catch (IOException e) {
        throw new Error("Error copying database");
    }
}

// Add your public helper methods to access and get content from the
// database.
// You could return cursors by doing "return myDataBase.query(....)" so it'd
// be easy
// to you to create adapters for your views.

}

toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
  • ×364
  • ×35
  • ×6
  • پرسیده شده: 18 ژانویه '13, 13:42
  • بازدید: 5,385 بار
  • آخرین بروزرسانی: 19 ژانویه '13, 21:15

این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها