آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

برنامه روی emulator خوب کار میکنه ولی روی گوشی نه.(مشکل دیتابیس)

احسان منصوری  12 سال پیش  11 سال پیش
+1 0

سلام

بچه ها نمیدونم چرا این مشکل بوجود اومده. برنامه من روی امولاتور کار میکنه و قشنگ از بانک میخونه و ذخیره میکنه

ولی همینکه فایل apk رو کپی میکنم تو گوشی، کار نمیکنه. یعنی فایل دیتابیس جدید ایجاد نمیشه و فایل قدیمی رو توی گوشی ایجاد میکنه. هر چی refresh میکنم، هرچی clean میزنم و دوباره اجرا میکنم بازم نمیشه. فایل دیتابیس رو روی گوشی پاک میکنم و برنامه رو هم دوباره نصب میکنم بازم از بانک نمیخونه.

فقط وقتی فایل دیتابیس رو وقتی به صورت دستی از کامپیوتر به گوشی انتقال میدم و جایگزین فایل قبلی میکنم، اونوقت درست کار میکنه

حالا به نظر شما چیکار کنم؟

یه سوال دیگه هم داشتم

برنامه من وقتی کد insert به بانک رو براش مینویسی که چندتا رکورد رو به بانک اضافه کنه، بار اول خوب کار میکنه ولی بار دوم که اجرا شه، کرش میکنه. اینم کدش. مشکلش چیه به نظرتون؟

ممنونم

0 0
سوال اولت، داره فایل رو از asset روی گوشی کپی میکنه یا با کوئری داره میسازتش؟ درباره سوال دومت هم بهتره خطای logcat رو بذاری. چون کدت که ظاهرا مشکلی نداره (12 سال پیش)
 برای این سوال 12 پاسخ وجود دارد.
پاسخ به سوال 
احسان منصوری  12 سال پیش
0 0

برای سوال اول، چون که من برای لاگین باید اطلاعات یک نفر رو از قبل روی بانک داشته باشم، اومدم از روی برنامه sqlite اطلاعات اون شخص رو ذخیره کردم و از طریق دکمه push اونو وارد ایکلیپس کردم و جایگزین بانک قبلی کردم. 

از فایل asset  نمیخونه. یعنی نمیدونم چجوریه اصلا

واسه سوال دوم اینم خطای logcat:

پاسخ به سوال 
sadeghbarout  12 سال پیش
+2 0

برای سوال اولت خب وقتی دیتابیس رو روی گوشی نداری خب معلومه کار نمیکنه. (وقتی هم دستی کپی میکنی شاید جای اشتباهی کپیش میکنه)

شما یا باید درتابیس رو از طریق کوئری بسازی که توی آموزش دیتابیس سایت هست

یا اینکه دیتابیس از پیش ساخته شده رو از assets به گوشی کپی کنی که توی آموزش بخش 19 ام (کتابخانه کپی فایل) موجوده

 

برای سوال دومت هم احتمالا موقع ساختن دیتابیست ، ستون email رو به عنوان primary key انتخاب کردی یا تیک گزینه uniqe رو زدی و این باعث میشه که داده تکراری قبول نکنه. شما آدرس ایمیل رو عوض کن و ببین که ثبت میشه یا نه؟ (احتمال قوی ثبت میشه)

پاسخ به سوال 
احسان منصوری  12 سال پیش
0 0

آهان. پس مشکلش اینه

سوال دوم رو کلا بیخیالش شدم. چون که باید ایمیلم یونیک باشه

واسه سوال اولم چون که فعلا به بخش 19 نرسیدم نمیفهمم  باید چیکار کنم. 

یعنی باید فایل دیتابیس رو کپی کنم توی پوشه asset? البته با کدنویسی:)

اینجوری مشکل حل میشه؟

پاسخ به سوال 
sadeghbarout  12 سال پیش
+1 0

دیتابیس رو به صورت دستی و از طریق eclipse کپی میکنی تو assets (مثل عکسا که میذاریم تو پوشه ها ) بعد با کد نویسی موقع اجرای برنامه یا هروقت احساس کردی نیازه  ، اون دیتابیس رو توی آدرس مورد نظر روی گوشی کپی میکنی. و از این به بعد از اون آدرس به دیتابست دسترسی پیدا میکنی

خیلی هم پیچیده نیست . احتمالا الان هم بتونی با دیدن اون بخش ، این کارو انجام بدی

موفق باشی

پاسخ به سوال 
احسان منصوری  12 سال پیش
0 0

  آقای sadeghbarout  ممنونم کارم راه افتاد

ولی یه مشکل کوچیک وجود داره و اونم اینه که وقتی برنامه رو روی گوشی نصب میکنم، وقتی واسه اولین بار اجرا میشه، کرش  میکنه

ولی وقتی واسه بار دوم اجرا میشه درست کار میکنه

اینم سورس کدم. البته برنامه روی امولاتور بدون کرش کار میکنه. وگرنه خطای logcat رو هم میذاشتم

0 0
شما هم دارید دیتابیسو میسازید هم کپی میکنید؟! یکیش کافیه. برای خطا ، متن خطای logcat رو بذارید تا ببینیم چی باعث خطا شده (12 سال پیش)
0 0
برنامه روی امولاتور خطایی نداره که خطای logcat رو بذارم. فقط روی گوشی کرش میکنه. یعنی چی یکیش کافیه؟ میشه بیشتر توضیح بدین که چجوری تعریف کنم؟ یعنی کدومشو تعریف کنم. البته ببخشید زیاد سوال میپرسم. آماتور بودن این مشکلات رو هم داره (12 سال پیش)
پاسخ به سوال 
احسان منصوری  12 سال پیش
0 0

آقای باروت کوب، ببخشید یه سوال:

مشکل اصلی دیتابیسم اینه که وقتی برنامه اجرا میشه، فایل دیتابیس رو از روی asset کپی میکنه توی sdcard.

برای بار دوم و سوم و چهارم و هر چند باری که برنامه اجرا شه، این فایل از اول از روی asset کپی میشه توی sdcard و بعد از بستن برنامه، و دوباره اجرا کردن اون، اطلاعاتی که از طریق برنامه وارد دیتابیس کردیم، با دوباره اجرا شدن برنامه، عملا پاک میشن و دیتابیس خالی جایگزین دیتابیس قبلی که اطلاعات روش بود میشه

حالا چطوری کاری کنم که اون فایل دیتابیس از روی asset فقط یکبار، اونم فقط موقع اولین اجرای برنامه کپی شه و دیگه هیچ وقت کپی نشه؟

پاسخ به سوال 
sadeghbarout  12 سال پیش
+1 0

ببین اولا که همونطور که گفتم همون کد های کپی دیتابیس کافیه و دیگه نیاز به اون کدهای کوئری creat ... نیست

درباره اینی که میگی دیتابیس دوباره کپی میشه خب معلومه. کد خودت رو نگاه کن.

نوشتی اگه فایل موجود بود اون رو پاک کن و بعد دوباره کپی کن:

 if(file.exists(){
file.delete();
//دستورات کپی
...

درصورتی که باید بگی اگه فایل وجود نداشت اونو دوباره کپی کن

 if(!file.exists(){
//دستورات کپی
...

اینجوری فقط در اولین اجرا کپی میشه و دفعه های بعدی میبینه فایل وجود داره و دیگه کپیش نمیکنه

پاسخ به سوال 
احسان منصوری  12 سال پیش
0 0

این درست. ولی توی کلاس دیگه  دیتابیس رو فراخوانی کردم. اگه اون کوئری ها رو پاک کنم خب چجوری توی اون کلاس ازش استفاده کنم؟

یعنی اگه اون کوئری ها رو پاک کنم، توی کلاسی که ازش استفاده کردم چجوری تغییرش بدم؟

0 0
اینکه شما داخل کلاس دیگه ای ازش استفاده کنید ، به این ربطی نداره که دیتابیس چطور روی گوشی بوجود اومده یا کپی شده. اون میبینه دیتابیس وجود داره یا نه و کوئری مورد نظر رو اجرا میکنه. اگه درست موجه سوالت نشدم ، سوالتون رو واضحتر بیان کنید. (12 سال پیش)
0 0
سلام دوستان خواستم سوالی بپرسم با توجه به اینکه مرتبط با همین مطلب بود گفتم همینجا بپرسم بهتره . من هم همین مشکل دوستمون رو داشتم و با توجه به نکاتی که گفته شد تقریبا حل شد . من فابل دیتابیس از پیش ساخته شده را از asset توی پوشه مورد نظر کپی کردم .روی امولاتور eclipse به خوبی کار میکنه روی دستگاه گوشی هم امتحان کردم مشکلی نداشت ولی توی genymotion که اجرا میکنم خطا میده و اصلا برنامه باز نمیشه . یه کم سرچ کردم تو اینترنت یه چیزایی هم از جمله این نوشته پیدا کردم ولی درست نشد . کسی میدونه مشکل چی هست ؟ از این چیزی میفهمید ؟ use run-as command to access your data directly. To make it short. Your app's data folder is protected by your app's user rights. The default shell user don't have right access to the app's folder. You can change the user that the shell is using thanks to the run-as command. 1.Open a shell: adb shell 2.Then type: run-as your.package.name This command will change the shell user to the user of your app. So you will have the right to read and write on the app's data. You will also be redirected to your app's data folder: /data/data/you.package.name When it is done you can browse your files easily. (12 سال پیش)
0 0
داداش، من کلا genymotion رو گذاشتم کنار. رو امولاتور و گوشی خوب کار میکنه پس برنامت مشکلی نداره. genymotion اگه درست کار کنه خیلی از امولاتور بهتره ولی متاسفانه خوب کار نمیکنه و توی این سایت اکثرا از امولاتور استفاده می کنن از جمله خود استاد (12 سال پیش)
0 0
محسن جان بهتر بود error لوگ کت رو میذاشتی. من خودم همیشه از جنی موشن استفاده میکنم و هیچ مشکلی هم باهاش ندارم و مخصوصا توی زمینه دیتابیس خیلی خوب عمل کرده تا الان. (12 سال پیش)
0 0
من با networkش مشکل داشتم. یعنی هربار که کانفیگ میکردم کار میکرد ولی همین که کامپیوترو خاموش میکردم، تنظیمات برمیگشت رو حالت قبلی و دیگه کار نمیکرد (12 سال پیش)
پاسخ به سوال 
mohsen-jj  12 سال پیش
0 0

دوستان مشکل من حل شد توی stackoverflow که سوال کرده بودن این جواب داده بود :

پاسخ به سوال 
mohsen-jj  12 سال پیش
0 0

یعنی باید مسیری که دیتابیس توش ذخیره میشه حتما اینجا باشه . من که همی کارو کردم مشکلم توی genymotion حل شد :) فقط به نظرتون کلی بخوایم در نظر بگیریم یعنی مسیر استاندارد کپی دیتابیس همینجا هست یا ... ؟اینم کدای خودم :

0 0
تا اونجایی که من میدونم ، مکان استاندارد پوشه android / data / package name هستش چون  این پوشه با حذف برنامه حذف میشه. (12 سال پیش)
0 0
مسیر اصلی "/data/data/PackageName/databases/DBName" هست (12 سال پیش)
پاسخ به سوال 
afr_msb  11 سال پیش
+1 0

کسی میتونه به من کمک کنه که چرا پایگاهم از 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" +
")");
}
0 0
حل شد (11 سال پیش)
پاسخ به سوال 
یگانه  11 سال پیش
0 0

  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();
}
}

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .