بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

کپی دیتابیس در مموری. (حل شد)

مدیریت گفتگو
javac 12 سال پیش
آخرین تغییر: 11 سال پیش

از این کد برای کپی دیتابیس از 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();
        }

    }
}

نظرات

طاهر 12 سال پیش
خطای لوگ کت رو درج گنید تا بررسی بشه
javac 12 سال پیش
به این گوشی ها دسترسی ندارم ، فقط دوستان اطلاع دادند که روی بعضی از گوشی ها مثل هواوی ascend p6 نصب نشده (پس logcat هم نمیدونم چی هست )  ولی مطمئن هستم خطا از همین الگوریتم هست!!
ایوب شمسی 11 سال پیش
عجله کردم اشتباه اینجا نظردرج کردم شرمنده دوستان

پاسخ‌ها 3

مجتبی یگانه 12 سال پیش

سلام

درسته ، مشکل من هم بود ، داستان اینه که دستگاه های قدیمی یا اصلی چین (!) ، حافظه ی داخلی شون ، بصورت SD Card تعریف نشده ، بنابراین ، شما میگین ، آدرس SD card رو بده ، میگه Not Mounted یعنی وصل نیست ! ، خوب تو این حالت ، من معمولا به کاربر پیام میدم ، "فضایی برای ذخیره سازی یافت نشد ، کارت حافظه را متصل کنید" ، اما میتونید روی خود دستگاه ذخیره کنید ، برای این کار باید اول مطمئن بشید SD card متصل نیست دیگه :| 

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
	// Using SD Card !
}
else {
	// mean : MEDIA_UNMOUNTED
	
}

و برای ذخیره سازی در دستگاه باید از حالت Mode_Private استفاده بشه ، که اینجا پرسیدم و پاسخ گرفتم 

موفق باشی

نظرات

hamidd 12 سال پیش
سلام دوستان. کدی, api ای یا هر چیز دیگه ای وجود داره که بتونیم متوجه بشیم که آیا گوشی از اون گوشی های قدیمیه یا از این گوشی های جدیده؟
javac 12 سال پیش
با همین دستور بالا چک کن ببین مموری mount شده یا نه
hamidd 12 سال پیش
با دستور بالا می تونیم فقط متوجه بشیم مموری mount شده یا نه. بنده نیاز به کدی دارم که متوجه بشم گوشی از اون گوشی های قدیمی هست یا نه.برنامم می خواد یه فایل رو از پوشه assets روی کارت حافظه بریزه.فرض میکنیم که برنامه روی یکی از این گوشی های جدید که حافظه ی داخلی رو به عنوان کارت حافظه میشناسن اجرا شده.ابتدا چک میکنه کارت حافظه وجود داره یا نه؟ که روی گوشی های جدید همیشه جواب true هست.در مرحله بعد چون جواب شرط قبلی true بود چک میکنه که فضای خالی به میزان کافی روی کارت حافظه وجود داره یا نه(توجه کنید که روی حافظه ی داخلی شرط چک میشه )؟ حالا فرض میکنیم حافظه به میزان کافی وجود نداره و به کاربر پیغام میده "حافظه ی خالی به میزان کافی وجود ندارد لطفا تعدادی فایل را از روی کارت حافظه حذف کنید" . این جاست که کاربر غافل از این که برنامه منظورش حافظه ی داخلیه میره توی حافظه ی خارجی و فایل ها رو حذف میکنه ولی مشکلش حل نشده و همچنان پابرجاست. البته برنامه روی گوشی های قدیمی خوب کار میکنه و فقط روی گوشه های جدید مشکل داره.بنابراین بنده نیاز به کدی دارم که متوجه بشم گوشی از اون گوشی های قدیمی هست یا نه.اگه از گوشی های جدید بود به جای پیغام "حافظه ی خالی به میزان کافی وجود ندارد لطفا تعدادی فایل را از روی کارت حافظه حذف کنید" ، پیغام "حافظه ی خالی به میزان کافی وجود ندارد لطفا تعدادی فایل را از روی حافظه داخلی حذف کنید" نمایش داده بشه ولی اگه از گوشی های قدیمی بود یغام "حافظه ی خالی به میزان کافی وجود ندارد لطفا تعدادی فایل را از روی کارت حافظه حذف کنید" نمایش داده بشه.
javac 12 سال پیش
پایین جواب دادم
javac 12 سال پیش

دهن ما رو سرویس کرده این گوشی های چینی !
وقتی 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();
	    }

نظرات

javac 12 سال پیش
خب وقتی متصل نیست از حالت دوم استفاده میشه دیگه اما وقتی مموری رو روی گوشی بزاری خطا میده ، به هر شکل مشکل رو به این صورت حل کردم که قسمت اول رو گذاشتم توی try و قسمت دوم رو هم توی catch دیگه خود سیستم مدیریت می کنه :))
javac 12 سال پیش

 
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 مناسب رو بنویس

نظرات

hamidd 12 سال پیش
دوست عزیزم مرسی از وقتی که گذاشتید. سر فرصت امتحانش می کنم.
PandaStudio 12 سال پیش
با این کد به نتیجه درست رسیدید؟
javac 12 سال پیش
من که به نتیجه رسیدم :)
Vampire 11 سال پیش
دوست عزیز تابع newFile و newContextWrapper رو میشه بگین چطوری تعریف شدن؟
javac 11 سال پیش
نکته اول اینکه زیاد سخت نگیرید و به صورت کلیشه ای جلوبرید :)) در واقع برای دسترسی به حافظه داخلی باید از private mode استفاده کنید که اول یک object از contextWrapper می سازید و به همون شیوه بالا اسم directory که "file" هست رو بهش میدین و دیتابیس رو اونجا کپی میکنه اگر اشتباه نکنم در مسیری بدین شکل : data/data/yourapp/app_data/file/db.sqlite البته از این بابت مطمئن نیستم در حال حاضر :)
mtn67 11 سال پیش
چرا برا من HelperIO رو نمیشناسه؟؟؟اصلا چی هست؟؟؟

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