برنامه روی emulator خوب کار میکنه ولی روی گوشی نه.(مشکل دیتابیس)
سلام
بچه ها نمیدونم چرا این مشکل بوجود اومده. برنامه من روی امولاتور کار میکنه و قشنگ از بانک میخونه و ذخیره میکنه
ولی همینکه فایل apk رو کپی میکنم تو گوشی، کار نمیکنه. یعنی فایل دیتابیس جدید ایجاد نمیشه و فایل قدیمی رو توی گوشی ایجاد میکنه. هر چی refresh میکنم، هرچی clean میزنم و دوباره اجرا میکنم بازم نمیشه. فایل دیتابیس رو روی گوشی پاک میکنم و برنامه رو هم دوباره نصب میکنم بازم از بانک نمیخونه.
فقط وقتی فایل دیتابیس رو وقتی به صورت دستی از کامپیوتر به گوشی انتقال میدم و جایگزین فایل قبلی میکنم، اونوقت درست کار میکنه
حالا به نظر شما چیکار کنم؟
یه سوال دیگه هم داشتم
برنامه من وقتی کد insert به بانک رو براش مینویسی که چندتا رکورد رو به بانک اضافه کنه، بار اول خوب کار میکنه ولی بار دوم که اجرا شه، کرش میکنه. اینم کدش. مشکلش چیه به نظرتون؟
ممنونم
برای سوال اولت خب وقتی دیتابیس رو روی گوشی نداری خب معلومه کار نمیکنه. (وقتی هم دستی کپی میکنی شاید جای اشتباهی کپیش میکنه)
شما یا باید درتابیس رو از طریق کوئری بسازی که توی آموزش دیتابیس سایت هست
یا اینکه دیتابیس از پیش ساخته شده رو از assets به گوشی کپی کنی که توی آموزش بخش 19 ام (کتابخانه کپی فایل) موجوده
برای سوال دومت هم احتمالا موقع ساختن دیتابیست ، ستون email رو به عنوان primary key انتخاب کردی یا تیک گزینه uniqe رو زدی و این باعث میشه که داده تکراری قبول نکنه. شما آدرس ایمیل رو عوض کن و ببین که ثبت میشه یا نه؟ (احتمال قوی ثبت میشه)
آهان. پس مشکلش اینه
سوال دوم رو کلا بیخیالش شدم. چون که باید ایمیلم یونیک باشه
واسه سوال اولم چون که فعلا به بخش 19 نرسیدم نمیفهمم باید چیکار کنم.
یعنی باید فایل دیتابیس رو کپی کنم توی پوشه asset? البته با کدنویسی:)
اینجوری مشکل حل میشه؟
دیتابیس رو به صورت دستی و از طریق eclipse کپی میکنی تو assets (مثل عکسا که میذاریم تو پوشه ها ) بعد با کد نویسی موقع اجرای برنامه یا هروقت احساس کردی نیازه ، اون دیتابیس رو توی آدرس مورد نظر روی گوشی کپی میکنی. و از این به بعد از اون آدرس به دیتابست دسترسی پیدا میکنی
خیلی هم پیچیده نیست . احتمالا الان هم بتونی با دیدن اون بخش ، این کارو انجام بدی
موفق باشی
  آقای sadeghbarout ممنونم کارم راه افتاد
ولی یه مشکل کوچیک وجود داره و اونم اینه که وقتی برنامه رو روی گوشی نصب میکنم، وقتی واسه اولین بار اجرا میشه، کرش میکنه
ولی وقتی واسه بار دوم اجرا میشه درست کار میکنه
اینم سورس کدم. البته برنامه روی امولاتور بدون کرش کار میکنه. وگرنه خطای logcat رو هم میذاشتم
آقای باروت کوب، ببخشید یه سوال:
مشکل اصلی دیتابیسم اینه که وقتی برنامه اجرا میشه، فایل دیتابیس رو از روی asset کپی میکنه توی sdcard.
برای بار دوم و سوم و چهارم و هر چند باری که برنامه اجرا شه، این فایل از اول از روی asset کپی میشه توی sdcard و بعد از بستن برنامه، و دوباره اجرا کردن اون، اطلاعاتی که از طریق برنامه وارد دیتابیس کردیم، با دوباره اجرا شدن برنامه، عملا پاک میشن و دیتابیس خالی جایگزین دیتابیس قبلی که اطلاعات روش بود میشه
حالا چطوری کاری کنم که اون فایل دیتابیس از روی asset فقط یکبار، اونم فقط موقع اولین اجرای برنامه کپی شه و دیگه هیچ وقت کپی نشه؟
ببین اولا که همونطور که گفتم همون کد های کپی دیتابیس کافیه و دیگه نیاز به اون کدهای کوئری creat ... نیست
درباره اینی که میگی دیتابیس دوباره کپی میشه خب معلومه. کد خودت رو نگاه کن.
نوشتی اگه فایل موجود بود اون رو پاک کن و بعد دوباره کپی کن:
if(file.exists(){
file.delete();
//دستورات کپی
...
درصورتی که باید بگی اگه فایل وجود نداشت اونو دوباره کپی کن
if(!file.exists(){
//دستورات کپی
...
اینجوری فقط در اولین اجرا کپی میشه و دفعه های بعدی میبینه فایل وجود داره و دیگه کپیش نمیکنه
این درست. ولی توی کلاس دیگه دیتابیس رو فراخوانی کردم. اگه اون کوئری ها رو پاک کنم خب چجوری توی اون کلاس ازش استفاده کنم؟
یعنی اگه اون کوئری ها رو پاک کنم، توی کلاسی که ازش استفاده کردم چجوری تغییرش بدم؟
یعنی باید مسیری که دیتابیس توش ذخیره میشه حتما اینجا باشه . من که همی کارو کردم مشکلم توی genymotion حل شد :) فقط به نظرتون کلی بخوایم در نظر بگیریم یعنی مسیر استاندارد کپی دیتابیس همینجا هست یا ... ؟اینم کدای خودم :

کسی میتونه به من کمک کنه که چرا پایگاهم از assets کپی نمیشه اینم کدم
new File(DIR_DATABASE).mkdirs();
manageDatabase();
File file = new File(DIR_DATABASE + "/TellOrgan.sqlite");
if ( !file.exists()) {
AssetManager assetmanager = context.getAssets();
InputStream inputStream;
try {
inputStream = assetmanager.open("TellOrgan.sqlite");
HelperIO.copyFile(inputStream, DIR_DATABASE + "/TellOrgan.sqlite");
}
catch (IOException e) {
e.printStackTrace();
}
}
}
private void manageDatabase() {
database = SQLiteDatabase.openOrCreateDatabase(DIR_DATABASE + "/TellOrgan.sqlite", null);
database.execSQL("CREATE TABLE IF NOT EXISTS Tell (" +
"tell_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , " +
"name_tell TEXT, " +
"number_tell TEXT, " +
"address_tell TEXT," +
"title_tell TEXT" +
")");
}
private void test() {
//HelperIO.copyFile(DIR_APP + "/sample-image.png", DIR_APP + "/copy-image.png");
AssetManager assetManager = context.getAssets();
InputStream inputStream;
try {
inputStream = assetManager.open("database.sqlite");
HelperIO.copyFile(inputStream, DIR_DATABASE + "/database.sqlite");
database = SQLiteDatabase.openOrCreateDatabase(DIR_DATABASE + "/database.sqlite", null);
}
catch (IOException e) {
e.printStackTrace();
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .



