کپی دیتابیس در مموری. (حل شد)
از این کد برای کپی دیتابیس از assets به مموری استفاده میکنم اما روی بعضی گوشی ها مثل "GLX , هواوی" برنامه به محض اجرا شدن کرش میکنه چکار کنم؟
public class G extends Application { public static Context context; public static SQLiteDatabase database; public static String packageName; public static String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath(); public static String DIR_APP; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); context = getApplicationContext(); packageName = context.getPackageName(); DIR_APP = DIR_SDCARD + "/android/data/" + packageName + "/file/"; new File(DIR_APP).mkdirs(); AssetManager assetManager = context.getAssets(); InputStream inputStream; try { File file = new File(DIR_APP + "/db.sqlite"); if ( !file.exists()) { inputStream = assetManager.open("db.sqlite"); HelperIO.copyFile(inputStream, DIR_APP + "/db.sqlite"); } if (file.exists()) { database = SQLiteDatabase.openDatabase(DIR_APP + "/db.sqlite", null, 0); } } catch (IOException e) { e.printStackTrace(); } } }
سلام
درسته ، مشکل من هم بود ، داستان اینه که دستگاه های قدیمی یا اصلی چین (!) ، حافظه ی داخلی شون ، بصورت SD Card تعریف نشده ، بنابراین ، شما میگین ، آدرس SD card رو بده ، میگه Not Mounted یعنی وصل نیست ! ، خوب تو این حالت ، من معمولا به کاربر پیام میدم ، "فضایی برای ذخیره سازی یافت نشد ، کارت حافظه را متصل کنید" ، اما میتونید روی خود دستگاه ذخیره کنید ، برای این کار باید اول مطمئن بشید SD card متصل نیست دیگه :|
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // Using SD Card ! } else { // mean : MEDIA_UNMOUNTED }
و برای ذخیره سازی در دستگاه باید از حالت Mode_Private استفاده بشه ، که اینجا پرسیدم و پاسخ گرفتم
موفق باشی
دهن ما رو سرویس کرده این گوشی های چینی !
وقتی memory توی گوشی قرار میگیره برنامه فورس کلوز میده (یعنی در حالت mounted) قسمت اول کد اجرا میشه ولی چون گوشی مزخرف چینی (GLX) هست برنامه کار نمیکنه و فورس کلوز میده
اما وقتی مموری رو خارج کنی ( یعنی مموری mount نشده) برنامه کار میکنه
خب باید چیکار کنم؟
try { context = getApplicationContext(); packageName = context.getPackageName(); if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { DIR_APP = DIR_SDCARD + "/android/data/" + packageName; new File(DIR_APP).mkdirs(); AssetManager manager = context.getAssets(); InputStream inputStream; File file = new File(DIR_APP + "/db.sqlite"); if ( !file.exists()) { inputStream = manager.open("db.sqlite"); HelperIO.copyFile(inputStream, DIR_APP + "/db.sqlite"); } if (file.exists()) { database = SQLiteDatabase.openDatabase(DIR_APP + "/db.sqlite", null, 0); } } if ( !Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { ContextWrapper cw = new ContextWrapper(getApplicationContext()); File directory = cw.getDir("file", Context.MODE_PRIVATE); directory.mkdirs(); File mypath = new File(directory, "/db.sqlite"); AssetManager manager = context.getAssets(); InputStream inputStream; if ( !mypath.exists()) { inputStream = manager.open("db.sqlite"); HelperIO.copyFile(inputStream, mypath + "/db.sqlite"); } if (mypath.exists()) { database = SQLiteDatabase.openDatabase(mypath + "/db.sqlite", null, 0); } } } catch (IOException e) { e.printStackTrace(); }
packageName = context.getPackageName(); try { DIR_APP = DIR_SDCARD + "/android/data/" + packageName; newFile(DIR_APP).mkdirs(); AssetManager manager = context.getAssets(); InputStream inputStream; File file = newFile(DIR_APP + "/db.sqlite"); if (!file.exists()) { inputStream = manager.open("db.sqlite"); HelperIO.copyFile(inputStream, DIR_APP + "/db.sqlite"); /** حافظه ی خالی به میزان کافی وجود ندارد لطفا تعدادی فایل را از روی کارت حافظه حذف کنید" */ } if (file.exists()) { database = SQLiteDatabase.openDatabase(DIR_APP + "/db.sqlite", null, 0); } } catch (Exception e) { ContextWrapper cw = new ContextWrapper(getApplicationContext()); File directory = cw.getDir("file", Context.MODE_PRIVATE); directory.mkdirs(); File mypath = newFile(directory, "/db.sqlite"); AssetManager manager = context.getAssets(); InputStream inputStream; if (!mypath.exists()) { inputStream = manager.open("db.sqlite"); HelperIO.copyFile(inputStream, mypath + "/db.sqlite"); /** حافظه ی خالی به میزان کافی وجود ندارد لطفا تعدادی فایل را از روی حافظه داخلی حذف کنید" */ } if (mypath.exists()) { database = SQLiteDatabase.openDatabase(mypath + "/db.sqlite", null, 0); } }
نکته :کد ها رو همین جا تغییر دادم ممکنه ایراد داشته باشه
الان دیگه کار نداریم که فایل دیتابیس به چه صورت کپی میشه خود سیستم مدیریت میکنه اگر نوع گوشی از این جدیدا باشه قسمت try و اگر glx و یا گوشی های قدیمی باشه از روش دوم فایل رو کپی میکنه حالا برای هر دو قسمت پیغام toast مناسب رو بنویس
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .