2011-07-19 15 views
3

内SQLiteのパスを取得し、私はアプリケーションを開発していると私はここでは2つの問題に実行しました:資産フォルダ

  1. にはどうすれば資産フォルダに保存されたSQLiteデータベースを開くことができますか?アプリケーションのアセットフォルダにアクセスするのにどのパスを使用しますか?ここで私がこれまで持っているものです。

    path = "file:///asset_folder/database.dat"; 
    SQLiteDatabase db = null; 
    db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); 
    
  2. 私は自分のアプリケーションのインストール中または最初の実行時に内部メモリ(/data/data/...)にファイルをコピーするにはどうすればよいですか?最初の実行中にassetsフォルダ内のフォルダを内部メモリにコピーしたいと思います。

ご意見をいただければ幸いです。

答えて

1

投稿者this投稿者thisチュートリアルが見つかりました。それはあなたの資産フォルダのデータベースを扱う方法を教えてくれます。それは少なくともあなたの最初の質問に答えます。私はあなたの第二のことについてあまりよく分かりません。

3

私は同じ問題を抱えていたので、私はRES /生フォルダにDBファイルを移動し、そうのようにそれをアクセス:私は/データ/データにファイルを移動しようとした

InputStream inputStream = getBaseContext().getResources().openRawResource(R.raw.mySQLiteFile); 

/com.mydomain.www/databases/フォルダがありますが、宛先パスが存在しないために例外が発生する可能性があります。File(destPath).getParentFile().mkdir();

そこから、dbを宛先に転送するためにdbを呼び出しました。

public void CopyDB(InputStream inputStream, OutputStream outputStream) throws IOException { 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = inputStream.read(buffer)) > 0) { 
      outputStream.write(buffer, 0, length); 
     } 
     inputStream.close(); 
     outputStream.close(); 
    } 

InputStreamはdbファイル、OutputStreamはFileOutputStream(destPath)です。

+1

なぜ資産外にコピーする必要がありますか?その後、あなたはユーザーの電話にスペースを浪費しています。 – Mark

1

アプリケーションのassetsフォルダからdata/data/databaseフォルダにデータベースをコピーします。 以下のコードを使用してください。

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DataBaseHelper1 extends SQLiteOpenHelper{ 

//The Android's default system path of your application database. 
public static String DB_PATH = "/data/data/com.XXX.XXX/databases/"; 
private static String DB_NAME = "india.sqlite"; 
private static String DB_NAME_MY = "india.sqlite"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 

/** 
* Constructor 
* Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
* @param context 
*/ 

public DataBaseHelper1(Context context){ 
    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
} 

/** 
* Creates a empty database on the system and rewrites it with your own database. 
* */ 
public void createDataBase() throws IOException{ 
    // for first database; 
    boolean dbExist = checkDataBase(DB_NAME); 
    if(!dbExist){ 
     try { 
      copyDataBase(DB_NAME_MY,DB_NAME); 
     } catch (Exception 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(String DB){ 
    SQLiteDatabase checkDB = null; 
    try{ 
     String myPath = DB_PATH + DB; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    }catch(SQLiteException e){} 

    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(String assetfile,String DB) { 

    //Open your local db as the input stream 
    InputStream myInput = null; 
    //Open the empty db as the output stream 
    OutputStream myOutput = null; 
    try { 
     myInput = myContext.getAssets().open(assetfile); 

     // Path to the just created empty db 
     String outFileName = DB_PATH + DB; 

     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(buffer, 0, length); 
     } 


     System.out.println("***************************************"); 
     System.out.println("####### Data base copied ##############"); 
     System.out.println("***************************************"); 


    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
      finally{ 
      //Close the streams 
      try { 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

} 

public void openDataBase() { 

    try { 
     //Open the database 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

@Override 
public synchronized void close() { 

     if(myDataBase != null) 
      myDataBase.close(); 

     super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int 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. 

} 
関連する問題