SQLite
 sql >> Baza danych >  >> RDS >> SQLite

jak uruchomić aplikację z SQLite darabase na emulatorze Android Studio?

Ponieważ masz trudności, poniżej znajduje się pospiesznie przygotowany samouczek wraz z kodem.

  1. Utwórz bazę danych i tabele w narzędziu SQLite, dodając wymagane dane, a następnie je Zapisz.

  2. Zamknij bazę danych i otwórz ją ponownie, aby sprawdzić, czy tabele i dane są zgodne z oczekiwaniami. Jeśli nie, wprowadź zmiany, a następnie powtarzaj 2, aż będziesz pewien, że zapisana baza danych pasuje.

  3. Uzyskaj nazwę pliku zapisanej bazy danych i zapisz ją wraz z rozszerzeniem pliku.

  4. Jeśli jeszcze nie utworzyłeś projektu dla aplikacji, zrób to i zapisz projekt.

  5. Poza środowiskiem IDE przejdź do folderu projektów app/src/main i utwórz folder o nazwie assets jeśli jeszcze nie istnieje.

  6. Skopiuj plik bazy danych do folderu zasobów.

  7. Otwórz projekt w Android Studio.

  8. Utwórz nową klasę Java o nazwie DatabaseHelper z SuperClass jako SQLiteOpenHelper (rozwiąże się jako android.database.sqlite.SQLiteOpenHelper ) i zaznacz Pokaż zastąpienia wyboru Pole wyboru w oknie dialogowym. Kliknij OK.

Powinno wyglądać tak:-

public class DatabaseHelper extends SQLiteOpenHelper {
    public Databasehelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}
  1. Dodaj linię, jako zmienną klasy, po public class DatabaseHelper extends SQLiteOpenHelper { to jest jak :-

    public static final String DBNAME = "my_dic.db";
    
    • Zwróć uwagę, że ważne jest, aby wartość w cudzysłowie była dokładnie taka sama jak nazwa pliku skopiowanego do folderu zasobów.

.

  1. Dodaj następujące zmienne klasy

:-

public static final int DBVERSION = 1;
public static final String TB_BOOKMARK = "Bookmark";
public static final String COL_BOOKMARK_KEY = "key";
public static final String COL_BOOKMARK_VALUE = "value";
public static final String COL_BOOKMARK_DATE = "date";
SQLiteDatabase mDB;
  • Zauważ, że wartości w cudzysłowie muszą być zgodne z nazwami tabeli/kolumn respetice, które zostały zdefiniowane w bazie danych dla TB_BOOKMARK, COL_BOOKMARK_KEY, COL_BOOKMARK_VALUE i COl_BOOKMARK_DATE.
    • DBVERSION będzie numerem wersji przechowywanym w polu user_version bazy danych.
    • SQliteDatabase mDB to deklaracja zmiennej przechowującej SQLiteDatabase po jej otwarciu. UWAGA obecnie jego wartość jest null, dopóki nie zostanie ustawiona.

.

  1. Zmień konstruktor dla klasy Databasehelper z :-

    public DatabaseHelper(kontekst kontekstu, nazwa ciągu, fabryka SQLiteDatabase.CursorFactory, wersja int) {super(kontekst, nazwa, fabryka, wersja);}

do :-

public DatabaseHelper(Context context) {
    super(context, DBNAME, null, DBVERSION);
}
  • Dzięki temu instancję klasy Databasehelper można utworzyć za pomocą tylko jednego parametru — kontekstu. Inne wartości zostały zdefiniowane lub w przypadku fabryki żadna nie zostanie użyta, więc null to oznacza.

.

  1. Dodaj metodę, ifDBExists do klasy DatabaseHelper, aby sprawdzić, czy baza danych istnieje (chcesz skopiować ją z pliku zasobów tylko raz)

:-

private boolean ifDBExists(Context context) {
    String dbparent = context.getDatabasePath(DBNAME).getParent();
    File f = context.getDatabasePath(DBNAME);
    if (!f.exists()) {
        Log.d("NODB MKDIRS","Database file not found, making directories."); //<<<< remove before the App goes live.
        File d = new File(dbparent);
        d.mkdirs();
        //return false;
    }
    return f.exists();
}
  • Oprócz sprawdzenia, czy plik bazy danych istnieje (zauważ, że zakłada się, że jest to prawidłowy plik bazy danych),
  • Dodatkowo, jeśli baza danych nie istnieje, może być tak, że katalog bazy danych nie istnieje, utworzy go, jeśli nie istnieje.

.

  1. Dodaj kolejną metodę copyDBFromAssets skopiować plik zasobów do bazy danych

:-

private boolean copyDBFromAssets(Context context) {
    Log.d("CPYDBINFO","Starting attemtpt to cop database from the assets file.");
    String DBPATH = context.getDatabasePath(DBNAME).getPath();
    InputStream is;
    OutputStream os;
    int length = 8192;
    long bytes_read = 0;
    long bytes_written = 0;
    byte[] buffer = new byte[length];

    try {

        is = context.getAssets().open(DBNAME);
    } catch (IOException e) {
        Log.e("CPYDB FAIL - NO ASSET","Failed to open the Asset file " + DBNAME);
        e.printStackTrace();
        return false;
    }

    try {
        os = new FileOutputStream(DBPATH);
    } catch (IOException e) {
        Log.e("CPYDB FAIL - OPENDB","Failed to open the Database File at " + DBPATH);
        e.printStackTrace();
        return false;
    }
    Log.d("CPYDBINFO","Initiating copy from asset file" + DBNAME + " to " + DBPATH);
    while (length >= 8192) {
        try {
            length = is.read(buffer,0,length);
        } catch (IOException e) {
            Log.e("CPYDB FAIL - RD ASSET",
                    "Failed while reading in data from the Asset. " +
                            String.valueOf(bytes_read) +
                            " bytes read ssuccessfully."
            );
            e.printStackTrace();
            return false;
        }
        bytes_read = bytes_read + length;
        try {
            os.write(buffer,0,length);
        } catch (IOException e) {
            Log.e("CPYDB FAIL - WR ASSET","failed while writing Database File " +
                    DBPATH +
                    ". " +
            String.valueOf(bytes_written) +
                    " bytes written successfully.");
            e.printStackTrace();
            return false;

        }
        bytes_written = bytes_written + length;
    }
    Log.d("CPYDBINFO",
            "Read " + String.valueOf(bytes_read) + " bytes. " +
                    "Wrote " + String.valueOf(bytes_written) + " bytes."
    );
    try {
        os.flush();
        is.close();
        os.close();
    } catch (IOException e ) {
        Log.e("CPYDB FAIL - FINALISING","Failed Finalising Database Copy. " +
                String.valueOf(bytes_read) +
                " bytes read." +
                String.valueOf(bytes_written) +
                " bytes written."
        );
        e.printStackTrace();
        return false;
    }
    return true;
}
  • Pamiętaj, że jest to celowo rozwlekłe, aby każda awaria mogła zostać zidentyfikowana.

Kompletna klasa DatabaseHelper miałaby teraz postać :-

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "my_dic.db"; // <<<< VERY IMPORTANT THAT THIS MATCHES DATABASE FILE NAME
    public static final int DBVERSION = 1;
    public static final String TB_BOOKMARK = "Bookmark";
    public static final String COL_BOOKMARK_KEY = "key";
    public static final String COL_BOOKMARK_VALUE = "value";
    public static final String COL_BOOKMARK_DATE = "date";
    SQLiteDatabase mDB;

    public DatabaseHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        if (!ifDBExists(context)) {
            if (!copyDBFromAssets(context)) {
                throw new RuntimeException("Failed to Copy Database From Assets Folder");
            }
        }
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }

    private boolean ifDBExists(Context context) {
        String dbparent = context.getDatabasePath(DBNAME).getParent();
        File f = context.getDatabasePath(DBNAME);
        if (!f.exists()) {
            Log.d("NODB MKDIRS","Database file not found, making directories.");
            File d = new File(dbparent);
            d.mkdirs();
            //return false;
        }
        return f.exists();
    }

    private boolean copyDBFromAssets(Context context) {
        Log.d("CPYDBINFO","Starting attemtpt to cop database from the assets file.");
        String DBPATH = context.getDatabasePath(DBNAME).getPath();
        InputStream is;
        OutputStream os;
        int length = 8192;
        long bytes_read = 0;
        long bytes_written = 0;
        byte[] buffer = new byte[length];

        try {

            is = context.getAssets().open(DBNAME);
        } catch (IOException e) {
            Log.e("CPYDB FAIL - NO ASSET","Failed to open the Asset file " + DBNAME);
            e.printStackTrace();
            return false;
        }

        try {
            os = new FileOutputStream(DBPATH);
        } catch (IOException e) {
            Log.e("CPYDB FAIL - OPENDB","Failed to open the Database File at " + DBPATH);
            e.printStackTrace();
            return false;
        }
        Log.d("CPYDBINFO","Initiating copy from asset file" + DBNAME + " to " + DBPATH);
        while (length >= 8192) {
            try {
                length = is.read(buffer,0,length);
            } catch (IOException e) {
                Log.e("CPYDB FAIL - RD ASSET",
                        "Failed while reading in data from the Asset. " +
                                String.valueOf(bytes_read) +
                                " bytes read ssuccessfully."
                );
                e.printStackTrace();
                return false;
            }
            bytes_read = bytes_read + length;
            try {
                os.write(buffer,0,length);
            } catch (IOException e) {
                Log.e("CPYDB FAIL - WR ASSET","failed while writing Database File " +
                        DBPATH +
                        ". " +
                String.valueOf(bytes_written) +
                        " bytes written successfully.");
                e.printStackTrace();
                return false;

            }
            bytes_written = bytes_written + length;
        }
        Log.d("CPYDBINFO",
                "Read " + String.valueOf(bytes_read) + " bytes. " +
                        "Wrote " + String.valueOf(bytes_written) + " bytes."
        );
        try {
            os.flush();
            is.close();
            os.close();
        } catch (IOException e ) {
            Log.e("CPYDB FAIL - FINALISING","Failed Finalising Database Copy. " +
                    String.valueOf(bytes_read) +
                    " bytes read." +
                    String.valueOf(bytes_written) +
                    " bytes written."
            );
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

.

  1. Zmień konstruktor, aby uruchomić copyDBFromAssets metoda gdy/jeśli baza danych nie istnieje (za pomocą ifDBExists metoda)

:-

public DatabaseHelper(Context context) {
    super(context, DBNAME, null, DBVERSION);
    if (!ifDBExists(context)) {
        if (!copyDBFromAssets(context)) {
            throw new RuntimeException("Failed to Copy Database From Assets Folder");
        }
    }
    mDB = this.getWritableDatabase();
}
  • Pamiętaj, że jeśli wystąpił problem podczas kopiowania bazy danych, aplikacja zostanie zatrzymana z powodu RunTimeExcpetion wydane.

.

  1. Ostatnia zmiana metody onCreate działania (zwykle byłaby to główna aktywność), aby utworzyć instancję klasy DatabaseHelper. Następnie uruchom aplikację (jeśli aplikacja została uruchomiona, najlepiej będzie przedtem usunąć dane aplikacji, na wypadek, gdyby została utworzona baza danych, być może pusta).

Poniższy kod zawiera również zapytanie, które powie, jakie tabele istnieją w bazie danych :-

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DatabaseHelper mDBHlpr = new DatabaseHelper(this);
        Cursor csr = mDBHlpr.getWritableDatabase().query(
                "sqlite_master",
                null,null,null,null,null,null
        );
        while (csr.moveToNext()) {
            Log.d("DB TABLES", csr.getString(csr.getColumnIndex("name")));
        }
        csr.close();
    }
}

Na podstawie zrzutu ekranu i pliku bazy danych o nazwie my_dic.db . Dane wyjściowe w dzienniku to:-

06-16 02:28:45.208 4467-4467/? D/NODB MKDIRS: Database file not found, making directories.
06-16 02:28:45.208 4467-4467/? D/CPYDBINFO: Starting attemtpt to cop database from the assets file.
    Initiating copy from asset filemy_dic.db to /data/data/com.mydictionaryapp.mydictionaryapp/databases/my_dic.db
    Read 12288 bytes. Wrote 12288 bytes.
06-16 02:28:45.224 4467-4467/? D/DB TABLES: Bookmark
    sqlite_autoindex_Bookmark_1
    android_metadata
  • To oznacza, że ​​:-
    • Baza danych nie istniała, a katalog baz danych został utworzony (tj. data/data/<package name>/databases )
    • 12288 bajtów zostało skopiowanych z pliku zasobów do pliku bazy danych (tj. wykonano udaną kopię).
    • Wynikowa baza danych zawiera trzy wpisy w tabeli sqlite_master, tabeli BookMark, tabeli o nazwie android_metadata (tabela tworzona automatycznie dla urządzeń z systemem Android przez SDK, która przechowuje ustawienia regionalne) oraz automatycznie generowany indeks dla tabeli BookMark.

Kolejne wydanie

Zasadniczo obiekt nie ma metody zwanej getClass, raczej musisz użyć odziedziczonej metody getClass z fragmentu. Musisz więc umieścić zwrócony fragment w nawiasach.

Więc zamiast :-

String activeFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container).getClass().getSimpleName();

Możesz użyć :-

String activeFragment = (getSupportFragmentManager().findFragmentById(R.id.fragment_container)).getClass().getSimpleName();

Alternatywnie możesz użyć :-

Fragment activeFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);

wraz z użyciem :-

if (activeFragment instanceOf BookmarkFragment) { ...... rest of your code

zamiast używać if (activeFragment.equals(BookmarkFragment.class.getSimpleName())) { ......




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Emulacja SQLite FULL OUTER JOIN

  2. Konwertuj SQLite na JSON

  3. SQLite JSON_GROUP_OBJECT()

  4. identyfikatory wierszy sqlite nie pasują do widoku listy — ANDROID

  5. Jak zainstalować SQLite i SQLite Browser w Ubuntu?