|
با سلام و خسته نباشید
من با استفاده از این آموزش http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ از دیتابیس از پیش ساخته شده در نرم افزارم استفاده می کنم و به خوبی کار می کند ولی زمانی که اطلاعات جدید به دیتابیس اضافه می کنم و نرم افزار رو آپدیت می کنم بعد از نصب دوباره نرم افزار ( replace ) اطلاعات دیتابیس بروز نمی شود و باید حتما نرم افزار قبلی حذف شود و دوباره نصب شود تا اطلاعات جدید دیتابیس بر روی گوشی کپی بشود . حالا من می خواهم با همان نصب دوباره ( repalce ) اطلاعات جدید دیتابیس کپی شود . با تشکر پیشاپیش از همه دوستان
در اندروید،زمانی که یک برنامه بروز رسانی می شود،بعضی از اطلاعاتی که توسط برنامه به روی دستگاه نوشته شده اند،باقی می مانند؛به عنوان مثال می توان به بانک های اطلاعاتی اشاره کرد که توسط برنامه ایجاد می شوند.در کدی که شما از آن استفاده کرده اید،در زمان اجرا ابتدا بررسی می شود که آیا بانک اطلاعاتی با نام مورد نظر موجود است یا نه؟ و در صورت عدم وجود،بانک اطلاعاتی را از 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");
}
}
با کمال تشکر از شما که وقتتون رو برای پاسخ به من گذاشتید در خصوص پاسختون درسته حتی من کد ها رو حذف کرده بودم ولی دیدم هر دفعه که برنامه اجرا میشه دیتابیس کپی می شود که فکر می کنم در برنامه زیاد خوب نباشه ؟ آیا به نظر شما مشکلی پیش نمی آید !
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.
}
من با کلیک روی لینکی که گداشته اید با "Nothing found for blog Usin..." روبرو شدم!
با تشکر اصلاح شد . البته من فکری کردم انکه می توانم در بروز رسانی های بعد اسم دیتابیس رو عوض کنم که دیتابیس آپدیت بشود راهی غیر از این باشه