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

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

javac  10 سال پیش  9 سال پیش
+11 0

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

    }
}
0 0
خطای لوگ کت رو درج گنید تا بررسی بشه (10 سال پیش)
0 0
به این گوشی ها دسترسی ندارم ، فقط دوستان اطلاع دادند که روی بعضی از گوشی ها مثل هواوی ascend p6 نصب نشده (پس logcat هم نمیدونم چی هست )  ولی مطمئن هستم خطا از همین الگوریتم هست!! (10 سال پیش)
0 0
لینک (10 سال پیش)
0 0
عجله کردم اشتباه اینجا نظردرج کردم شرمنده دوستان (10 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
مجتبی یگانه  10 سال پیش
+5 0

سلام

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

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

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

موفق باشی

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

دهن ما رو سرویس کرده این گوشی های چینی !
وقتی 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();
	    }
0 0
خوب وقتی متصل نیست Mode_private بساز دیگه ! (10 سال پیش)
0 0
خب وقتی متصل نیست از حالت دوم استفاده میشه دیگه اما وقتی مموری رو روی گوشی بزاری خطا میده ، به هر شکل مشکل رو به این صورت حل کردم که قسمت اول رو گذاشتم توی try و قسمت دوم رو هم توی catch دیگه خود سیستم مدیریت می کنه :)) (10 سال پیش)
پاسخ به سوال 
javac  10 سال پیش
+5 0

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

0 0
دوست عزیزم مرسی از وقتی که گذاشتید. سر فرصت امتحانش می کنم. (10 سال پیش)
0 0
با این کد به نتیجه درست رسیدید؟ (10 سال پیش)
+2 0
من که به نتیجه رسیدم :) (10 سال پیش)
0 0
دوست عزیز تابع newFile و newContextWrapper رو میشه بگین چطوری تعریف شدن؟ (9 سال پیش)
+2 0
نکته اول اینکه زیاد سخت نگیرید و به صورت کلیشه ای جلوبرید :)) در واقع برای دسترسی به حافظه داخلی باید از private mode استفاده کنید که اول یک object از contextWrapper می سازید و به همون شیوه بالا اسم directory که "file" هست رو بهش میدین و دیتابیس رو اونجا کپی میکنه اگر اشتباه نکنم در مسیری بدین شکل : data/data/yourapp/app_data/file/db.sqlite البته از این بابت مطمئن نیستم در حال حاضر :) (9 سال پیش)
0 0
چرا برا من HelperIO رو نمیشناسه؟؟؟اصلا چی هست؟؟؟ (9 سال پیش)

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