2010-04-09 8 views
33

Jak odczytać dane z pliku bazy danych plików sqlite zasobów z rozszerzeniem .sqlite w mojej aplikacji Android?Android: Dostęp do pliku bazy danych plików sqlite zasobów z rozszerzeniem .sqlite

+0

Dlaczego umieściłeś plik .sqlite w folderze assets zamiast w/res/raw? – Macarse

+0

Będziesz chciał wypróbować [android sqlite asset helper] (https://github.com/jgilfelt/android-sqlite-asset-helper). To sprawia, że ​​to bułka z masłem. – craned

Odpowiedz

0

Jeśli planujesz utworzyć nową bazę danych SQLite, przejedź i zastosuj metodę onCreate(), jak pokazano w samouczku.

Ale jeśli używasz bazy danych SQLite, która jest tworzona przez inne zewnętrzne źródło i zamierzasz ją ściągnąć, pozostaw metodę onCreate() pustą.

2

Ważne jest, aby w samouczku podczas wywoływania pliku upewnić się, że kontekst aplikacji getApplicationContext() jest taki, że masz dostęp do poprawnych zasobów, w przeciwnym razie możesz uzyskać wyjątek FileNotFound.

33

Spróbuj kod:

public class DataBaseHelper extends SQLiteOpenHelper { 
    private Context mycontext; 

    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/"; 
    private static String DB_NAME = "(datbasename).sqlite";//the extension may be .sqlite or .db 
    public SQLiteDatabase myDataBase; 
    /*private String DB_PATH = "/data/data/" 
         + mycontext.getApplicationContext().getPackageName() 
         + "/databases/";*/ 

    public DataBaseHelper(Context context) throws IOException { 
     super(context,DB_NAME,null,1); 
     this.mycontext=context; 
     boolean dbexist = checkdatabase(); 
     if (dbexist) { 
      //System.out.println("Database exists"); 
      opendatabase(); 
     } else { 
      System.out.println("Database doesn't exist"); 
      createdatabase(); 
     } 
    } 

    public void createdatabase() throws IOException { 
     boolean dbexist = checkdatabase(); 
     if(dbexist) { 
      //System.out.println(" Database exists."); 
     } else { 
      this.getReadableDatabase(); 
      try { 
       copydatabase(); 
      } catch(IOException e) { 
       throw new Error("Error copying database"); 
      } 
     } 
    } 

    private boolean checkdatabase() { 
     //SQLiteDatabase checkdb = null; 
     boolean checkdb = false; 
     try { 
      String myPath = DB_PATH + DB_NAME; 
      File dbfile = new File(myPath); 
      //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE); 
      checkdb = dbfile.exists(); 
     } catch(SQLiteException e) { 
      System.out.println("Database doesn't exist"); 
     } 
     return checkdb; 
    } 

    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("/data/data/(packagename)/databases /(datbasename).sqlite"); 

     // transfer byte to inputfile to outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myinput.read(buffer))>0) { 
      myoutput.write(buffer,0,length); 
     } 

     //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(mypath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    public synchronized void close() { 
     if(myDataBase != null) { 
      myDataBase.close(); 
     } 
     super.close(); 
    } 

} 
+0

nice, działa dobrze dla mnie; d –

+3

W faktycznie kodowania tego do produkcji użyj mycontext.getApplicationInfo(). DataDir zamiast twardego kodowania "/ data/data/(nazwa pakietu)". Jest to oficjalny sposób uzyskania katalogu danych aplikacji. – wheredidthatnamecomefrom

6

Place starą bazę danych (old.db) w folderze aktywów. Wpisz ten wewnątrz onCreate() swojego działania:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
.... 

//=======Code For copying Existing Database file to system folder for use====// 
    // Copying Existing Database into system folder 
     try { 

      String destPath = "/data/data/" + getPackageName() 
        + "/databases/data.db"; 

      File f = new File(destPath); 
      if(!f.exists()){ 
      Log.v(TAG,"File Not Exist"); 
      InputStream in = getAssets().open("old.db"); 
      OutputStream out = new FileOutputStream(destPath); 

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

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.v("TAG","ioexeption"); 
      e.printStackTrace(); 
     } 

     DBManager dbManager = new DBManager(this); 
     Log.v(TAG,"Database is there with version: "+dbManager.getReadableDatabase().getVersion()); 
     String sql = "select * from prizes"; 


     SQLiteDatabase db = dbManager.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(sql, null); 
     Log.v(TAG,"Query Result:"+cursor); 


     cursor.close(); 
     db.close(); 
     dbManager.close(); 

.... 

} 

Teraz trzeba zrobić Class DBManager które podklasy SQLiteOpenHelper. Wstaw abstrakcyjną metodę i konstruktor. Nie zapomnij wpisać poprawną nazwę bazy danych wewnątrz super() z dbHelper.

public class DBManager extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String TAG = "DATABASES"; 

public DBManager(Context context) { 
    super(context, "data.db", null, DATABASE_VERSION); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    Log.v(TAG,"On create Called:"+db.getPath()); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
} 
} 

Teraz można uzyskać dostęp do bazy danych poprzez utworzenie instancji DBManager.

SQLiteDatabase db = dbManager.getReadableDatabase(); 
Cursor cursor = db.rawQuery(sql, null); 
... 

Nie zapomnij zamknąć bazy danych lub otrzymasz wyjątek SQLiteDatabaseNotClosed.

db.close(); 
dbManager.close(); 
1

Będziesz chciał wypróbować android sqlite asset helper. To sprawiło, że otworzenie dla mnie wcześniej istniejącego kawałka bułka z masłem.

Dosłownie miałem to działa w około pół godziny po spędzeniu 3 godzin próbując zrobić to wszystko ręcznie. Zabawne jest to, myślałem, że robię to samo, co biblioteka dla mnie, ale czegoś brakowało!

0

Można tylko odczytać bazę danych z folderu zasobów, ponieważ foldery zasobów są tylko do odczytu. Jeśli potrzebujesz więcej operacji, takich jak tworzenie, aktualizacja, usuwanie, możesz robić sztuczki. Skopiuj bazę danych z folderu zasobów do magazynu, a następnie możesz zrobić wszystko, co chcesz.

Oto szybki przykład Working with Android Pre Built Database.

Jest łatwy w użyciu biblioteki zbyt dostępu do bazy danych z folderu aktywów. Możesz sprawdzić Android SQLiteAssetHelper (https://github.com/jgilfelt/android-sqlite-asset-helper). Powodzenia!

0

Konieczna jest konwersja bazy danych .sqlite na .db w celu dopasowania do systemu Android.

w swojej aplikacji za pierwszym uruchomieniu po instalacji

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM); 

Na kolejnych startów

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE); 

Wystarczy odpalić zapytań SQL

database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');"); 

Pobierz wyniki na tablicy w CSV, JSON, XML

ArrayList<String> rows=new ArrayList<String>(); 
rows=database.sqlEjectCSV("SELECT * FROM food;"); 
for (int i=0;i<rows.size();i++) 
{ 
    //Do stuffs with each row 
} 

Musisz do tego dodać moją bibliotekę. Dokumenty tutaj:
https://github.com/sangeethnandakumar/TestTube

Powiązane problemy