وقتی دیتا بیس جدید رو می ریزم آپدیت نمی شه
با عرض سلام و خسته نباشید خدمت تمامی اساتید.
من یک مشکل در رابطه با دیتا بیس دارم و اونم اینکه کاربر وقتی مثلا برنامم رو نصب کرد .
اگر برنامم رو آپدیت کنم و دیتا بیس رو مثلا محتواش رو کم یا بیشتر کنم اگه طرف آپدیت کنه برنامم رو نمی افته روش .
برای استفاده باید بره از تو تنظیمات دیتا بیس رو پاک کنه و از نو برنامه رو نصب کنه .
(((((((((((می خوام این اطفاق نیفته و دیتا بیس جدید بیفته رو دیتا بیس قدیمی و آپدیت شه ))))))))
چگونه این کار رو عملی کنم ؟
ممنون می شم کمک کنید . اگر هم منت به سر ما گذاشته و جواب دادید لطفا در مورد کد هم کمی توضیح بدید که چیه و چه کار باید انجام بدم
ممنون :X
-
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;
}
}
دوستان لطفا کمکم کنین :(
الان دو هفتس لنگه اینم . اصلا نمی تونم رفعش کنم .
از اساتیدو دوستان خوبم هر کی بلده لطفا کمک کنه
یه شرط بذار که چک کنه فایل تو فلان پوشه وجود داره یا نه، اگر وجود داشت حذفش کنه. اینو می تونی توی کلاس G (اگر اینچنین کلاسی نوشتی) یا ابتدای شروع برنامه بذاری و طوری تنظیمش کنه که فقط برای اولین اجرا اینو چک کنه.
File f = new File(G.DIR_DATABASE + filename);
if (f.exists){
f.delete();
}
سلام.
شما از همون ابتدا باید متد 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) {}
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .