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

مشکل بزرگ و نادر در دیتابیس ( هشداری که استاد داده بودند ! )

Reza  8 سال پیش  8 سال پیش
0 0

سلام

    یه مشکل خیلی بزرگ برام پیش اومده ، همون مشکلی که استاد در آموزش دیتابیس گفتن که اگر cursor بسته نشه دیگه تحت هیچ شرایط برنامه بالا نمیاد . خب از همون اوائل ( یک سال پیش ) که این آموزش رو دیدم یک عادت خوب که داشتم این بود که بعد از ایجاد cursor تمام عملیات مربوط به اون رو داخل try میذاشتم و در catch میگفتم که cursor.close  ،  تا در صورت خطا cursor بسته شه . تا الانم مشکلی نداشتم و همیشه دیتابیس رو تغییر میدادم و جایگزین میکردم و تست میکردم .

    اما الان فایل دیتابیس رو که میریزم داخل assets ، برنامه که اجرا میشه ، در جنی موشن هم فایلم تولید میشه و در File Explorer نشون میده . همون اول فایل رو میکشم بیرون و با SQLite Manager میبینم درسته ، همون فایل خودمه . بعد کار با نرم افزار رو ادامه میدم تا برسه به جایی که از دیتابیس میخواد استفاده کنه . به محض دسترسی به دیتابیس برنامه خطا میده که فلان table وجود نداره و البته در File Explorer هم فایل دیتابیس حجمش کم میشه ( 0.1 میشه ) و یه فایل database-journal.sqlite در کنارش تولید میشه ( البته این فایل دوم همیشه ایجاد میشد ولی فایل اصلی حجمش کم نمیشد ) . حالا فایل اصلی رو میکشم بیرون میبینم که بله ، table ای که میگه وجود نداره و اصلا هیچکدوم از 10 table وجود نداره . الان 3 ساعته هر کار میکنم و فایل اصلی رو جایگزین میکنم ، فایل خراب میشه و تمام جداول از بین میره .

    دیگه واقعا داره اعصابم خورد میشه . باید چیکار کنم ؟ کسی همچین مشکلی نداشته ؟ اگه دقیقا به همون علت باشه که استاد گفتن "دیگه برنامه بالا نمیاد" ( که البته در مورد من برنامه بالا میاد ولی موقع دسترسی به دیتابیس ، فایل خراب میشه ) ، حالا راهش چیه ؟ نصب دوباره جنی موشن مشکل رو حل میکنه ؟ ممنونم .

+1 0
سلام.نه مشکل شما از cursor نیست.احتمالا هر بار که نرم افزارتون اجرا میشه،فایل دیتابیس رو از asset می خونید و روی فایل قبلی رونویسی می کنید.باید اول چک کنید،اگه فایل وجود نداشت،اونوقت کپیش کنید... (8 سال پیش)
0 0
نه از assets نمیخونم . فایل یک بار در کلاس G از assets ریخته میشه روی کارت حافظه و بعد از اون با هر بار اجرای مجدد برنامه دیگه این فایل ساخته نمیشه . (8 سال پیش)
+1 0
خب شما دارین از دیتابیس آماده ای که توی asset گذاشتین استفاده می کنید.پس احتمالا جداول رو از قبل طراحی کردین و اگه بعد از اجرا، جدولاتون از بین می ره،احتمالا یا کلاس دیتابیستون مشکل داره و یا اینکه همون مشکلی که تو کامنت قبلی گفتم پیش اومده که البته شما گفتین این حالت ممکن نیست اتفاق بیفته.خب میشه بخشی از کدهاتون رو اینجا بذارین تا ببینیم مشکل از کجاست؟ (ترجیحا کلاس G و ...). (8 سال پیش)
0 0
نه کلاس دیتابیس مشکلی نداره . نزدیک به یک ساله دارم از همین دیتابیس بدون مشکل استفاده میکنم . فقط هر موقع دیتابیس آماده رو تغییر میدادم ( چون هنوز کامل نشده ، هر وقت بیکار میشم دیتابیس رو توسعه میدم ) ، اول از روی جنی موشن حذف میکردم و بعد برنامه رو اجرا میکردم ، تا دوباره ساخته بشه روی کارت حافظه . (8 سال پیش)
+1 0
من احتمال میدم به خطای نوع سوم برخوردید یعنی خطای منطقی که فکر می کنید همه چی درسته! احتمالا یه جای کدتون یه اشتباهی کردید.جایی drop table نزدید ؟ در ضمن cursor.close رو توی بلاک finally بزارید که چه بعد از try چه بعد از catch حتما cursor بسته بشه. (8 سال پیش)
0 0
من اصلا کد رو تغییر ندادم ، و Drop هم ندارم . در مورد cursor.close هم اشتباه گفتم که در catch نوشتم ، در همون finally نوشتم و در catch فقط متن خطا و toast نمایش میدم . ولی دو اشتباهی که انجام دادم و احتمال میدم از اونا باشه در پاسخ زیر میذارم . (8 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
Reza  8 سال پیش
0 0

کارهایی که دیروز انجام دادم و به خطا خوردم :

1 - من همیشه برنامه رو روی جنی موشن تست میکردم و وقتی از صحتش مطمئن میشدم روی گوشی هم تست میکردم تا ظاهرش رو در گوشی هم ببینم . دیروز وقتی برنامه در جنی موشن درست کار کرد گوشی رو وصل کردم و برنامه رو اجرا کردم و دیدم نتایج غیر منتظره میده . دیتابیس موجود در گوشی رو بررسی کردم ، و فهمیدم که چون فایل دیتابیس در گوشی موجود بوده ( در تست های قبلی ) دوباره نساخته و باید اول از رو گوشی پاکش میکردم . البته رکورد جدیدی به دیتابیس اضافه نکرده بودم ، ولی به این دلیل میگم باید دوباره کپی میشد ، چون 2 تا از فیلدها ( ستون ها ) رو در SQLite Manager با هم جابجا کرده بودم ( حالا شاید بگین به چه دردی میخوره جابجا کردن ستون ها - دلیلش اینه که یک آرایه ای در برنامه تولید میشه که ترتیبش عناصرش اگه مثل ترتیب ستون های دیتابیس باشه ، من میتونم با فقط یک حلقه رکوردها رو آپدیت کنم و دیگه نیازی به cursor.getColumnIndex نباشه ) . این فایل دیتابیس جدید رو حواسم بود که در جنی موشن جایگزین کنم ولی وقتی اومدم روی گوشی تست کنم این کار رو نکردم و برنامه با همون دیتابیس قبلی کار کرد ، و بررسی که کردم دیدم نتیجه این شده که در یک ستون از نوع integer یک مقدار double ریخته میشد ، البته این double مقدارش 0 بوده که در ستون integer ریخته میشد .

    دیتابیس قدیمی روی گوشی رو کپی کردم توی جنی موشن ، تا ببینم همون نتایج غیر منتظره روی جنی موشن هم نشون میده یا نه ، و دیدم که نتایج اشتباهه . اینجا بود که کاملا مطمئن شدم ایراد از چیه ( پاک نکردن دیتابیس قبلی و جایگزین نکردن دیتابیس جدید )

حالا جالب اینجاست که :

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

 

2 - دومین تغییری که در ساختار دیتابیس دادم این بود که :

    خاصیت Auto Increment مربوط به id رو از روی تمام table ها برداشتم . البته با این ساختار 1 هفته میشه دارم کار میکنم و مشکلی نداشتم و رکوردها رو در برنامه به دفعات حذف و اضافه میکردم . این میتونه دلیل باشه ؟ مثلا رکوردی که قبلا با id = 7 وجود داشته و بعد در برنامه توسط کاربر حذف میشه و کاربر دوباره یک رکورد میسازه ، چون جدول Auto Increment نیست ، این رکورد میتونه دوباره id  = 7 بگیره . این میتونه خطایی ایجاد کنه ؟

0 0
این مشکل اونقدر عجیبه که من فکر نمیکنم برای کسی اتفاق افتاده باشه . ولی باز هم اگه احتمالی میدید که ایراد از چیه ممنون میشم بگید . (8 سال پیش)
0 0
مشکلم به طرز عجیب تر از خود مشکل حل شده ، اما هنوز نگرانم و نمیدونم چرا این مشکل ایجاد شد و چرا رفع شد . من حتی برنامه رو از روی جنی موشن پاک کرده بودم ولی جواب نداد . اما این دفعه اومدم یک دیتابیس اشتباه ( دو ستون جابجا ) رو که عناصرش UNIQUE نیست وارد برنامه کردم و درست اجرا شد و دیتابیس از بین نرفت . بعد از این دیگه دیتابیس اصلی و درست هم بدون مشکل کار می کرد ، ولی چرا ....... (8 سال پیش)
پاسخ به سوال 
121397  8 سال پیش
+1 0

منم همین مشکل رو داشتم ....دیتا بیس کپی میشد ولی درون دیتا بیس جدولی موجود نبود اشکال کار از اینجا بود که

private void copyDB(InputStream inputStream, OutputStream outputStream)throws IOException{
byte[] buffer = new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0){
outputStream.write(buffer,0,length );
 inputStream.close();
outputStream.close();


}

}
inputStream.close();
outputStream.close();
ایت دو تا دستور رو می بایست خارح دستور نوشته میشد یعنی









private void copyDB(InputStream inputStream, OutputStream outputStream)throws IOException{
byte[] buffer = new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0){
outputStream.write(buffer,0,length );


}
inputStream.close();
outputStream.close();
}
0 0
نه مشکل از این نیست . من اصلا مشکل با کد جاوا ندارم ، یکساله دارم با همین کدها کار میکنم . مشکل اینه که برنامه یک بار با دیتابیس اشتباه کار کرده و حالا دیگه با دیتابیس اصلی و درست هم کار نمیکنه . در ضمن کدهای استاد هم به همین شکل هست واصلا inputStream.close() داخل while معنی نمیده . (8 سال پیش)
0 0
مشکل از جایی دیگه ست نه اینکه با دیتابیس اشتباه کار کرده دیگه با درست کار نکنه. شما بهتره کد را در اینجا قرار بدید تا دوستان کمک کنند. پاسخ دادن به سوال وقتی نمیبینیم نمیتواند دقیق باشد و شما هم جواب دقیقی نخواهید گرفت (8 سال پیش)

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