SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

bagaimana cara meluncurkan aplikasi dengan SQLite darabase di emulator Android Studio?

Saat Anda mengalami kesulitan, berikut ini adalah tutorial yang disusun dengan cepat beserta kodenya.

  1. Buat database dan tabel dalam alat SQLite, tambahkan data sesuai kebutuhan, lalu Simpan.

  2. Tutup database dan buka kembali untuk memeriksa apakah tabel dan data sesuai dengan yang diharapkan. Jika tidak lakukan perubahan lalu ulangi 2 sampai Anda yakin bahwa database yang disimpan cocok.

  3. Dapatkan nama file dari database yang disimpan dan catat itu termasuk ekstensi file.

  4. Jika Anda belum membuat Proyek untuk Aplikasi, lakukan dan simpan proyek.

  5. Di luar IDE, navigasikan ke folder project app/src/main dan buat folder bernama aset jika belum ada.

  6. Salin file database ke folder aset.

  7. Buka Proyek di Android Studio.

  8. Buat Kelas Java baru bernama DatabaseHelper dengan SuperClass sebagai SQLiteOpenHelper (akan diselesaikan menjadi android.database.sqlite.SQLiteOpenHelper ) dan centang Show Select Overrides Kotak centang dialog. Klik OK.

Seharusnya terlihat seperti :-

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. Tambahkan baris, sebagai variabel kelas, setelah public class DatabaseHelper extends SQLiteOpenHelper { itu seperti :-

    public static final String DBNAME = "my_dic.db";
    
    • Memperhatikan bahwa penting bahwa nilai dalam tanda kutip sama persis dengan nama file yang disalin ke folder aset.

.

  1. Tambahkan variabel kelas berikut

:-

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;
  • Memperhatikan bahwa nilai dalam tanda kutip harus cocok dengan nama tabel/kolom respetice yang ditentukan dalam database untuk TB_BOOKMARK, COL_BOOKMARK_KEY, COL_BOOKMARK_VALUE dan COl_BOOKMARK_DATE.
    • DBVERSION akan menjadi nomor versi yang disimpan di bidang user_version database.
    • SQliteDatabase mDB adalah deklarasi variabel untuk menampung SQLiteDatabase ketika telah dibuka. CATATAN saat ini nilainya adalah null hingga disetel.

.

  1. Ubah konstruktor untuk kelas Databasehelper dari :-

    public DatabaseHelper(Konteks konteks, nama String, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}

ke :-

public DatabaseHelper(Context context) {
    super(context, DBNAME, null, DBVERSION);
}
  • Ini membuatnya jadi turunan dari kelas Databasehelper dapat dibuat hanya dengan satu parameter, konteksnya. Nilai lain telah ditentukan atau dalam kasus pabrik tidak ada yang akan digunakan, jadi null menandakan ini.

.

  1. Tambahkan metode, ifDBExists ke kelas DatabaseHelper untuk memeriksa apakah database ada (Anda hanya ingin menyalinnya dari file aset satu kali)

:-

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();
}
  • Selain memeriksa apakah file database ada (perhatikan bahwa file database dianggap valid),
  • Selain itu, jika database tidak ada, mungkin direktori database tidak ada, ini akan membuatnya jika tidak ada.

.

  1. Tambahkan metode lain copyDBFromAssets untuk menyalin file aset ke database

:-

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;
}
  • Perhatikan bahwa ini sengaja dibuat bertele-tele, sehingga kegagalan apa pun dapat diketahui.

Kelas DatabaseHelper yang lengkap sekarang adalah :-

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. Ubah konstruktor untuk menjalankan copyDBFromAssets metode ketika/jika Database tidak ada (menggunakan ifDBExists metode)

:-

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();
}
  • Perhatikan jika ada masalah menyalin Database maka Aplikasi akan dihentikan karena RunTimeExcpetion dikeluarkan.

.

  1. Terakhir mengubah metode onCreate aktivitas (biasanya akan menjadi aktivitas utama) untuk membuat instance kelas DatabaseHelper. Kemudian jalankan Aplikasi (jika Aplikasi telah dijalankan, sebaiknya hapus data Aplikasi sebelum melakukannya, untuk berjaga-jaga jika database, mungkin kosong, telah dibuat.)

Kode berikut juga menyertakan kueri yang akan memberi tahu Anda tabel apa yang ada di database :-

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();
    }
}

Berdasarkan tangkapan layar dan file database bernama my_dic.db . Output dalam Log adalah :-

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
  • Ini menunjukkan bahwa :-
    • Basis data tidak ada dan direktori basis data telah dibuat (yaitu data/data/<package name>/databases )
    • 12288 byte disalin dari file aset ke file database (yakni, salinan berhasil dibuat).
    • Database yang dihasilkan memiliki tiga entri dalam tabel sqlite_master, tabel BookMark, tabel bernama android_metadata (tabel yang secara otomatis dibuat untuk perangkat android oleh SDK yang menyimpan lokal) dan indeks yang dibuat secara otomatis untuk tabel BookMark.

Masalah Berikutnya

Pada dasarnya objek tidak memiliki metode yang disebut getClass, melainkan Anda perlu menggunakan metode getClass yang diwarisi dari Fragmen. Jadi, Anda perlu menyertakan fragmen yang dikembalikan dalam tanda kurung.

Jadi bukannya :-

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

Anda dapat menggunakan :-

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

Sebagai alternatif, Anda dapat menggunakan :-

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

bersama dengan menggunakan :-

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

daripada menggunakan 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. TABEL DROP SQLite

  2. Masalah dengan kueri penyisipan di Sqlite? (masukkan variabel)

  3. SQLite FULL OUTER JOIN Emulation

  4. Tidak dapat membuka database dalam mode baca/tulis

  5. Memasukkan tanggal dan waktu saat ini dalam database SQLite