ورود

View Full Version : استفاده از دیتابیس از پیش ساخته شده + آندروید



sajadpm
چهارشنبه 27 دی 1391, 20:45 عصر
با سلام و خسته نباشید

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

sajadpm
جمعه 29 دی 1391, 13:09 عصر
کسی نبود از دوستان کمک کنه ؟

Modernidea
شنبه 30 دی 1391, 02:47 صبح
سلام

برای بروز رسانی دیتابیس باید اعمال لازم برای بروز رسانی را در تابع onUpgdare مربوط به کلاس SQLite Helper پیاده سازی کنید.
این اعمال زمانی اجرا میشود که نسخه دیتابیس خود را ارتقا دهید.

برای این کار شما باید هر دفعه که تغییراتی روی دیتابیس انجام میدهید، نسخه دیتابیس را ارتقا دهید.
نسخه دیتابیس در تابع سازنده کلاس مشتق شده از SQLiteOpenHelper انجام میشود که با توجه به لینکی که شما مشخص کردید همان تابع DataBaseHelper میشود.

public DataBaseHelper(Context context) {

super(context, DB_NAME, null, 1);
this.myContext = context;
}

عدد 1 همان نسخه دیتابیس شماست. هر دفعه که تغییراتی در دیتابیس ایجاد میکنید باید این عدد را افزایش دهید.
با افزایش این عدد، هر دفعه که از درون برنامه قصد دسترسی و خواندن یا نوشتن به دیتابیس را داشته باشید، در صورتی که نسخه تعیین شده در این تابع بزرگتر از نسخه فعلی موجود نصب شده برو روی دستگاه باشد، عملیات مربوط به بروزرسانی انجام میشود.
این عملیات در تابع onUpgarde همین کلاس انجام میشود.
یعنی شما باید کدهای لازم برای بروز رسانی دیتابیس خود را در دل این تابع قرار دهید:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}


خوب، اگر قصد دارید که کل دیتابیس را حذف و دیتابیس جدید را جایگزین کنید که راحترین راه است، باید عمل کپی کردنی را که قبلا هم برای ایجاد دیتابیس انجام میدادید، درون تابع بروزرسان بالا نیز انجام دهید.(در انتهای پست کلاس کامل را برای این هدف خاص ضمیمه شده است) اما این را در نظر داشته باشید که با این کار تمام داده های قبلی از بین میرود!
اما اگر قصد دارید که فیلدی به جدول اضافه یا کم کنید و یا هر کار دیگری، باید از دستورات SQL برای این کار استفاده کنید. یعنی با دستورات SQL امور لازم به بروزرسانی جداول را در تابع onUpgrade اجرا کنید.

کد زیر، همان کلاسی است که در لینک پست اول اشاره کردید، با این تفاوت که اگر مقدار متغیر DB_VERS را افزایش دهید، تابع onUpgarede اجرا شده و کل دیتابیس جایگزین دیتابیس قبلی میشود.

موفق باشید.


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.
}

amir.b
شنبه 12 بهمن 1392, 16:09 عصر
سلام،
من با توجه به راهنمای زیر کلاس DatabaseHelper رو ساختم و کدی که در پست بالا دوستمون گذاشته رو داخلش ذخیره کردم اما موقعی برنامه رو توی شبیه ساز اجرا می کنم دیتابیسم که توی فولدر assets قرارش دادم توی برنامه کپی نمیشه! خطایی هم نمیده!
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
آیا باید کلاس دیگه ای ایجاد کنم ؟ یا توی mainactivity یا manifest کد خاصی وارد کنم ؟ لطفا راهنمایی کنید. من تازه کار هستم و با دستورات sqlite هم زیاد آشنایی ندارم!
من یک دیتابیس ساختم و توش پر از اطلاعات هست و حالا می خوام توی اپلیکیشنم فقط بتونم توی یک اکتیویتی به صورت listview نمایششون بدم و توی یک activity دیگه سرچشون کنم. عمل درج و حذف و آپدیت هم نمی خوام انجام بدم!
لطفا راهنمایی کنید. دیگه زیاد وقت ندارم! هر چی آموزش هست برای ساخت دیتابیس موقع اجرای برنامه هست!!! ممنون از لطفتون

rubiks.kde
شنبه 12 بهمن 1392, 17:24 عصر
اگه کپی نمیشه مطمئنن یه جایی از کدتون اشتباس.یک بار دیگه تمام موارد رو چک کنید.

hamedjj
شنبه 12 بهمن 1392, 18:22 عصر
لازم هم نیست این کارها را بکنید
از کتابخونه زیر استفاده کنید ... راحت هم میتوانید database را آپدیت کنید
https://github.com/jgilfelt/android-sqlite-asset-helper

amir.b
شنبه 12 بهمن 1392, 20:06 عصر
لازم هم نیست این کارها را بکنید
از کتابخونه زیر استفاده کنید ... راحت هم میتوانید database را آپدیت کنید
https://github.com/jgilfelt/android-sqlite-asset-helper



میشه لطفا یه راهنمایی ساده بکنید ... یعنی باید یه کلاس از نوع SQLiteOpenHelper به نام SQLiteAssetHelper بسازم ؟ بعدش دیتابیس کپی میشه توی برنامه ؟ بعد چطوری توی mainactivity داده ها رو نمایش بدم ؟ میشه یه خورده بیشتر و با جزئیات راهنمایی کنید ؟ ممنون از لطفتون

amir.b
شنبه 12 بهمن 1392, 20:08 عصر
لطفا طریقه ی ساختن کلاس SQLiteOpenHelper رو توضیح بدید. میگم شاید توی این مرحله اشتباهی کردم که جواب نمیده!

amir.b
شنبه 12 بهمن 1392, 20:25 عصر
لازم هم نیست این کارها را بکنید
از کتابخونه زیر استفاده کنید ... راحت هم میتوانید database را آپدیت کنید
https://github.com/jgilfelt/android-sqlite-asset-helper



ببخشید این کتابخونه رو چطوری باید توی پروژه م در ایکلیپس import کنم ؟

mahdi2elve
شنبه 01 فروردین 1394, 02:07 صبح
نحوه کار باهاش رو توضیح میدین یکمی؟

majid_7
جمعه 04 اردیبهشت 1394, 09:52 صبح
ببخشید این کتابخونه رو چطوری باید توی پروژه م در ایکلیپس import کنم ؟

کاربر عزیز آقای Poorman در این رابطه یه تاپیک ایجاد کرده اند، جا داره واقعا ازشون تشکر کرد
http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper
امیدوارم مفید واقع بشه