ورود

View Full Version : مشکل در کپی دیتابیس از assets به فولدر databases



ghader62
یک شنبه 06 بهمن 1392, 10:37 صبح
سلام خدمت همه دوستان
من میخوام یک دیتابیس با حجم 6 مگا رو از assets به فولدر databases کپی کنم متد کپی من بصورت زیر میباشد
(permission دسترسی به حافظه رو هم در منیفست وارد کردم)
public static void copyDataBase(String databaseName) throws IOException {
String DB_PATH = ("/data/data/" + gContext.getPackageName() + "/" + "databases/");
InputStream myInput = gContext.getAssets().open(databaseName);
OutputStream myOutput = new FileOutputStream(DB_PATH + databaseName);

byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}

که خطای زیرور توی لوگ کت نشون میده

java.io.IOException
at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$700(AssetM anager.java:36)
at android.content.res.AssetManager$AssetInputStream. read(AssetManager.java:571)
at com.ghader.total.G.copyDataBase(G.java:111)
at com.ghader.total.G.onCreate(G.java:40)
at android.app.Instrumentation.callApplicationOnCreat e(Instrumentation.java:969)
at android.app.ActivityThread.handleBindApplication(A ctivityThread.java:4244)
at android.app.ActivityThread.access$3000(ActivityThr ead.java:125)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:2071)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.jav a:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:626)
at dalvik.system.NativeStart.main(Native Method)

دقیقا این متد رو برای دیتابیس مشابه و با سایز 7 کیلو آزمایش کردم که درست عمل کرد ولی با سایزهای مگا مشکل پیدا میکنه. در جاهایی دیدم که این متد برای دیتابیس با سایز 50 مگا هم درست کار کرده، ولی نمیدونم چرا اینجا نمیتونم درست جواب بگیرم
ممنون میشم اگه دوستان کمکی بکنند.

rubiks.kde
یک شنبه 06 بهمن 1392, 17:14 عصر
من تابع شما رو به این صورت تغییر دادم و از اون برای خواندن فایل های بزرگ هم استفاده کردم.

public Boolean CopyContent(String databaseName){

try {
String DB_PATH = "/data/data/" + gContext.getPackageName() + "/" + "databases/";
File file = new File(DB_PATH, databaseName);
if(file.exists())
return true;
AssetManager assetManager = gContext.getAssets();
InputStream inputStream = assetManager.open(databaseName);
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}

if(inputStream != null)
inputStream.close();
if(outputStream != null){
outputStream.flush();
outputStream.close();
}
return true;
} catch (Exception e) {
return false;
}
}

ghader62
سه شنبه 08 بهمن 1392, 16:19 عصر
rubiks.kde (http://barnamenevis.org/member.php?231180-rubiks.kde) عزیز بابت جوابتون ممنون
اما متدی که شما برایم ارسال نمودید برای کپی کردن فایلها درست جواب میده ولی وقتی میخوام که یک دیتابیس با فرمت .sqlite رو بخونم که سایزش هم بیشتر از 1 مگا هستش متد، فایل رو ایجاد میکنه ولی تو حلقه while نمیافته و سایز دیتابیس کپی شده صفر میمونه
با جستجویی که انجام دادم راه حلی رو پیدا کردم که ممکنه بعدا به درد دوستان هم بخوره

من اومدم extension فایلی که توی assets بود رو عوض کردم مثلا به .mp3 .و موقع اجرای متد، بشکل mp3 اونرو خوندم ولی به فرمت .sqlite داخل فولدری که میخواستم کپی کردم
که هیچ اروری گرفته نشد و دیتابیس هم تکمیل کپی شد

reza_azizi2010
یک شنبه 13 بهمن 1392, 15:01 عصر
برای اینکار نیازی نیست گوشی روت باشه؟

shahin bahari
یک شنبه 13 بهمن 1392, 15:58 عصر
برای اینکار نیازی نیست گوشی روت باشه؟
هر برنامه به فولدر دیتا خودش دسترسی داره. اگر لازم باشه به فولدر دیتای بقیه برنامه ها دسترسی داشت اون موقع روت لازمه.