انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

#1
با سلام
چگونه می‌توان دیتابیس را از پوشه ی assets به پوشه‌ی /data/data/packagename/databases/ کپی کرد؟ پایگاه داده‌ی من حجمی بالای یک مگابایت دارد. بعد از جستجو در اینترنت هم کد زیر را پیدا کردم اما این کد تنها پوشه‌ی databases را می‌سازد و فایل را کپی نمی‌کند:

کد پی‌اچ‌پی:
public class CopyFile extends Application {
     private static final 
String DB_PATH "/data/data"+getPackageName()+"/databases/";
      private static final 
String DB_NAME "database.db";
     @
Override
        
public void onCreate () {
            
super.onCreate();   
                
copyAssetFolder(getAssets(),DB_NAME
                       
DB_PATH);}

        private static 
boolean copyAssetFolder(AssetManager assetManager,
                
String fromAssetPathString toPath) {
            try {
                
String files assetManager.list(fromAssetPath);
                new 
File(toPath).mkdirs();
                
boolean res true;
                for (
String file files)
                    if (
file.contains("."))
                        
res &= copyAsset(assetManager
                                
fromAssetPath "/" file,
                                
toPath "/" file);
                    else 
                        
res &= copyAssetFolder(assetManager
                                
fromAssetPath "/" file,
                                
toPath "/" file);
                return 
res;
            } catch (
Exception e) {
                
e.printStackTrace();
                return 
false;
            }
        }

        private static 
boolean copyAsset(AssetManager assetManager,
                
String fromAssetPathString toPath) {
            
InputStream in null;
            
OutputStream out null;
            try {
              
in assetManager.open(fromAssetPath);
              new 
File(toPath).createNewFile();
              
out = new FileOutputStream(toPath);
              
copyFile(inout);
              
in.close();
              
in null;
              
out.flush();
              
out.close();
              
out null;
              return 
true;
            } catch(
Exception e) {
                
e.printStackTrace();
                return 
false;
            }
        }

        private static 
void copyFile(InputStream inOutputStream outthrows IOException {
            
byte buffer = new byte[1024];
            
int read;
            while((
read in.read(buffer)) != -1){
              
out.write(buffer0read);
            }
        }

    } 

 کد زیر را نیز به فایل Manifest اضافه کرده ام:

کد پی‌اچ‌پی:
<application 
        android
:name="packagename.CopyFile"
        
android:icon="@drawable/icon" 
        
android:label="@string/app_name" 
        
android:debuggable="true"
پاسخ

کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

#2
ببینید موقع اجرا و ساخت پوشه و بعدش کپی کردن در لاگ چه پیغامی میده
پاسخ
 سپاس شده توسط admin ، ramtin2080

کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

#3
سلام.
من یک نگاه کلی به کدتون انداختم. خط زیر را ببینید :

کد پی‌اچ‌پی:
private static final String DB_PATH "/data/data"+getPackageName()+"/databases/"

به نظر می آبد که یک علامت / را جا انداخته اید، یعنی باید به صورت زیر باشد :

کد پی‌اچ‌پی:
private static final String DB_PATH "/data/data/"+getPackageName()+"/databases/"

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط ramtin2080

کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

#4
این لاگ ها نمایش داده می‌شود: (فقط لاگ های قرمز و نارنجی را قرار دادم):

کد پی‌اچ‌پی:
03-30 18:55:35.841W/ActivityThread(8976): Application com.test.app can be debugged on port 8100...
03-30 18:55:35.851W/ActiveOrDefaultContextProvider(8950): Missing scope.enter somewhereReturning default context
03
-30 18:55:35.851W/ResourceType(8976): CREATING STRING CACHE OF 44 bytes
03
-30 18:55:36.231E/AdvWidget(1598): Unknown function: onTrimMemory
03
-30 18:55:36.811E/FmProxy(9115): Could not bind to IFmReceiverService Service
03
-30 18:55:46.831E/cutils(302): Failed to mkdirat(/storage/sdcard1/Android): Read-only file system 

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

کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

#5
کسی کد دیگه‌ای رو سراغ داره که کار کنه؟
پاسخ

کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

#6
 
کد پی‌اچ‌پی:
public class database extends SQLiteOpenHelper {

    public final 
String   path "data/data/*your-package-name*/databases/";
    public final 
String   Name "your db name";
    public 
SQLiteDatabase mydb;
    private final 
Context mycontext;


    public 
database(Context context) {
        
super(context"your db name"null1);
        
mycontext context;
    }


    @
Override
    
public void onCreate(SQLiteDatabase arg0) {

    }


    @
Override
    
public void onUpgrade(SQLiteDatabase arg0int arg1int arg2) {

    }


    public 
void useable() {
        
boolean checkdb checkdb();
        if (
checkdb) {

        } else {
            
this.getReadableDatabase();
            try {
                
copydatabase();
            }
            catch (
IOException e) {    
            
            }
        }
    }


    public 
void open() {
        
mydb SQLiteDatabase.openDatabase(path NamenullSQLiteDatabase.OPEN_READWRITE);
    }


    @
Override
    
public void close() {
        
mydb.close();
    }


    public 
boolean checkdb() {
        
SQLiteDatabase db null;
        try {
            
db SQLiteDatabase.openDatabase(path NamenullSQLiteDatabase.OPEN_READONLY);
        }
        catch (
SQLException e) {

        }
        return 
db != null true false;
    }


    public 
void copydatabase() throws IOException {

        
OutputStream myOutput = new FileOutputStream(path Name);
        
byte[] buffer = new byte[1024];
        
int lenght;
        
InputStream myInput mycontext.getAssets().open(Name);
        while ((
lenght myInput.read(buffer)) > 0) {
            
myOutput.write(buffer0lenght);
        }
        
myInput.close();
        
myOutput.flush();
        
myOutput.close();
    } 
 
پاسخ
 سپاس شده توسط داش بهروز ، ramtin2080 ، admin

کپی کردن پایگاه داده از پوشه‌ی assets به data (حافظه‌ی داخلی) (اندروید)

#7
با کمک دوستان عزیزی که من را راهنمایی کردند و این سایت موقق به کپی کردن پایگاه داده به آدرس  /data/data/PACKAGE_NAME/databases/   در حافظه داخلی شدم، این آموزش را برای کسانی که مشکل دارند می‌گذارم:
1. ابتدا یک کلاس با نام DataBaseHelper از گسترش SQLiteOpenHelper ساختم و کد زیر را داخل آن قرار دادم:

کد پی‌اچ‌پی:
public class DataBaseHelper extends SQLiteOpenHelper{
 
    
//The Android's default system path of your application database.
    
private static String DB_PATH "/data/data/YOUR_PACKAGE/databases/";  //در این قسمت نام پکیج جایگزین شود
 
    
private static String DB_NAME "myDBName"//در این قسمت تنها نام فایل دیتابیس که درون پوشه قرار دارد جایگزین شود
 
    
private SQLiteDatabase myDataBase
 
    private final 
Context myContext;
 
  
    public 
DataBaseHelper(Context context) {
 
        
super(contextDB_NAMEnull1);
        
this.myContext context;
    }    
 
  
/**
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    
public void createDataBase() throws IOException{
 
        
boolean dbExist checkDataBase();
 
        if(
dbExist){
            
//do nothing - database already exist
        
}else{
 
            
//By calling this method and empty database will be created into the default system path
               //of your application so we are gonna be able to overwrite that database with our database.
            
this.getReadableDatabase();
 
            try {
 
                
copyDataBase();
 
            } catch (
IOException e) {
 
                throw new 
Error("Error copying database");
 
            }
        }
 
    }
 
    
/**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */
    
private boolean checkDataBase(){
 
        
SQLiteDatabase checkDB null;
 
        try{
            
String myPath DB_PATH DB_NAME;
            
checkDB SQLiteDatabase.openDatabase(myPathnullSQLiteDatabase.OPEN_READONLY);
 
        }catch(
SQLiteException e){
 
            
//database does't exist yet.
 
        
}
 
        if(
checkDB != null){
 
            
checkDB.close();
 
        }
 
        return 
checkDB != null true false;
    }
 
    
/**
     * Copies your database from your local assets-folder to the just created empty database in the
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    
private void copyDataBase() throws IOException{
 
        
//Open your local db as the input stream
        
InputStream myInput myContext.getAssets().open(DB_NAME);
 
        
// Path to the just created empty db
        
String outFileName DB_PATH DB_NAME;
 
        
//Open the empty db as the output stream
        
OutputStream myOutput = new FileOutputStream(outFileName);
 
        
//transfer bytes from the inputfile to the outputfile
        
byte buffer = new byte[1024];
        
int length;
        while ((
length myInput.read(buffer))>0){
            
myOutput.write(buffer0length);
        }
 
        
//Close the streams
        
myOutput.flush();
        
myOutput.close();
        
myInput.close();
 
    }
 
    public 
void openDataBase() throws SQLException{
 
        
//Open the database
        
String myPath DB_PATH DB_NAME;
        
myDataBase SQLiteDatabase.openDatabase(myPathnullSQLiteDatabase.OPEN_READONLY);
 
    }
 
    @
Override
    
public synchronized void close() {
 
            if(
myDataBase != null)
                
myDataBase.close();
 
            
super.close();
 
    }
 
    @
Override
    
public void onCreate(SQLiteDatabase db) {
 
    }
 
    @
Override
    
public void onUpgrade(SQLiteDatabase dbint oldVersionint newVersion) {
 
    }
 
        
// Add your public helper methods to access and get content from the database.
       // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
       // to you to create adapters for your views.
 


2.سپس در کلاس دیگری که قصد داشتم دیتابیس ساخته شود کد زیر را قرار دادم:

کد پی‌اچ‌پی:
DataBaseHelper db = new DataBaseHelper(context);
   try 
    {
        
db.createDataBase();
    } 
    catch (
IOException io
    {
        throw new 
Error("Unable to create database");
    } 
پاسخ
 سپاس شده توسط داش بهروز ، admin ، شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان