Penyimpanan dan akses data - pertemuan pertama dengan pangkalan data SQLite


Pengenalan kepada bahagian ini:

Dalam bahagian ini kita terus mempelajari cara ketiga penyimpanan dan akses data Android: pangkalan data SQLite, yang berbeza daripada pangkalan data SQL yang lain. Kami tidak perlu memasang perisian pangkalan data lain pada telefon mudah alih Sistem Android telah menyepadukan pangkalan data ini Kami tidak perlu memasang perisian pangkalan data lain seperti Apabila menggunakan perisian pangkalan data lain (Oracle, MSSQL, MySql, dll.), anda perlu memasangnya, melengkapkan konfigurasi yang berkaitan dan menukar port! Itu sahaja untuk pengenalan, mari belajar tentang perkara seterusnya ini~


1 Konsep asas

1) Apakah itu SQLite? Mengapa menggunakan SQLite? Apakah ciri-ciri SQLite?

Jawapan: Sila dengar penjelasan Xiaozhu di bawah:

①SQLite ialah pangkalan data hubungan ringan dengan kelajuan pengkomputeran yang pantas dan penggunaan sumber yang rendah peranti, Ia bukan sahaja menyokong sintaks SQL standard, tetapi juga mengikut prinsip ACID (urus niaga pangkalan data) Tiada akaun diperlukan, dan ia sangat mudah digunakan!

② Sebelum ini kami belajar menggunakan fail dan SharedPreference untuk menyimpan data, tetapi dalam banyak kes, Fail itu tidak semestinya sah, contohnya, akses serentak oleh berbilang rangkaian adalah berkaitan; Seperti memasukkan dan mengeluarkan wang dari bank! Menggunakan dua yang pertama akan kelihatan sangat tidak berkuasa atau menyusahkan Kemunculan pangkalan data boleh menyelesaikan masalah ini. Dan Android memberikan kita SQLite yang begitu ringan, mengapa tidak menggunakannya?

③SQLite menyokong lima jenis data : NULL, INTEGER, REAL (nombor titik terapung), TEKS (teks rentetan) dan BLOB (objek binari) Walaupun terdapat hanya lima jenis, jenis data lain seperti varchar dan char boleh disimpan kerana SQLite mempunyai ciri terbesar: Anda boleh menyimpan data pelbagai jenis data ke dalam mana-mana medan tanpa mengambil berat tentang pengisytiharan medan jenis data , seperti milik anda Rentetan boleh disimpan dalam medan jenis Integer, sudah tentu kecuali untuk mengisytiharkannya sebagai kunci utama INTEGER PRIMARY Medan KEY hanya boleh menyimpan integer 64-bit ! Di samping itu, apabila SQLite menghuraikan pernyataan CREATE TABLE, Maklumat jenis data berikutan nama medan dalam pernyataan CREATE TABLE akan diabaikan Sebagai contoh, pernyataan berikut akan mengabaikan maklumat jenis medan nama: CREATE TABLE person (personid integer primary key autoincrement, name varchar(20. ))

Ringkasan ciri:

SQlite menyimpan pangkalan data melalui fail Fail ialah pangkalan data, dan pangkalan data mengandungi berbilang borang, dan terdapat Berbilang rekod, setiap rekod terdiri daripada berbilang medan, setiap medan mempunyai nilai yang sepadan dan untuk setiap nilai kita boleh menentukan jenis , atau tidak dinyatakan Taip (kecuali kunci utama)

PS: By the way, SQLite terbina dalam Android ialah versi SQLite 3~

2) Beberapa kelas berkaitan:

Hei, apabila anda mempelajari sesuatu yang baharu, perkara yang paling anda tidak suka ialah menemui beberapa istilah baharu, bukan? Tiga kelas yang kami gunakan apabila menggunakan pangkalan data:

  • SQLiteOpenHelper: kelas abstrak, kami mewarisi kelas ini dan kemudian menimpa kaedah penciptaan dan kemas kini pangkalan data, Kami juga boleh mendapatkan contoh pangkalan data melalui objek kelas ini, atau menutup pangkalan data!
  • SQLiteDatabase: Kelas akses pangkalan data: Kita boleh menggunakan objek kelas ini untuk melakukan beberapa operasi menambah, memadam, mengubah suai dan menyemak pangkalan data
  • Kursor : Kursor , agak serupa dengan set keputusan dalam JDBC, set hasil! Ia boleh difahami secara ringkas sebagai menunjuk ke titik tertentu dalam pangkalan data Penunjuk rekod!

2 Gunakan kelas SQLiteOpenHelper untuk mencipta pangkalan data dan pengurusan versi

Untuk apl yang melibatkan pangkalan data, adalah mustahil untuk kami mencipta secara manual. pangkalan data untuk mereka fail, jadi anda perlu mendayakan apl itu buat kali pertama Jadual pangkalan data dibuat apabila aplikasi dinaik taraf apabila aplikasi kami perlu dinaik taraf dan struktur jadual pangkalan data perlu diubah suai, kali ini Jadual pangkalan data telah dikemas kini; untuk kedua-dua operasi ini, Android menyediakan kami dengan dua kaedah SQLiteOpenHelper, onCreate( ) dan onUpgrade( ) Pelaksanaan

analisis kaedah:

  • onCreate(pangkalan data): Jana jadual pangkalan data apabila menggunakan perisian buat kali pertama
  • onUpgrade(database,oldVersion,newVersion): Akan dipanggil apabila versi pangkalan data berubah. Secara amnya, nombor versi hanya perlu ditukar apabila perisian dinaik taraf, dan versi pangkalan data dikawal oleh pengaturcara Andaikan bahawa versi pangkalan data semasa Versinya ialah 1. Disebabkan oleh perubahan perniagaan, struktur jadual pangkalan data telah diubah suai Pada masa ini, perisian perlu dinaik taraf Apabila menaik taraf perisian, anda berharap Kemas kini struktur jadual pangkalan data dalam telefon mudah alih pengguna Untuk mencapai tujuan ini, versi pangkalan data asal boleh ditetapkan kepada 2 Atau mana-mana nombor lain yang berbeza daripada nombor versi lama!

Contoh kod:

public class MyDBOpenHelper extends SQLiteOpenHelper {
    public MyDBOpenHelper(Context context, String name, CursorFactory factory,
            int version) {super(context, "my.db", null, 1); }
    @Override
    //数据库第一次创建时被调用
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE person(personid INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))");
        
    }
    //软件版本号发生改变时调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL");
    }
}

Analisis kod:

Kod di atas ialah yang pertama Apabila kami memulakan aplikasi kali pertama, kami akan mencipta fail my.db dan melaksanakan kaedah dalam onCreate(). Buat jadual Orang dengan dua medan, kekunci utama personId dan medan nama, kemudian kami mengubah suai versi db nombor, maka kaedah dalam onUpgrade() akan dipanggil kali seterusnya ia dimulakan, dan medan lain akan dimasukkan ke dalam jadual! Di samping itu, ini adalah sisipan Medan, jadi data tidak akan hilang Jika jadual dibina semula, semua data dalam jadual akan hilang Mari ajar anda cara menyelesaikan masalah ini!

Ringkasan Proses:

  • Langkah 1: Sesuaikan kelas untuk mewarisi kelas SQLiteOpenHelper
  • Langkah 2: Tetapkan dalam super pembina bagi kelas Nama pangkalan data dan nombor versi yang akan dibuat
  • Langkah 3: Tulis semula kaedah onCreate() untuk mencipta struktur jadual
  • Langkah 4: Tulis Semula Kaedah onUpgrade() mentakrifkan operasi yang dilakukan selepas nombor versi berubah

3 Cara melihat fail db yang kami hasilkan

Apabila kami panggil MyDBOpenhelper di atas Objek getWritableDatabase() akan mencipta db kami dalam direktori berikut Fail pangkalan data:

8.png

Kami mendapati terdapat dua pangkalan data, yang pertama adalah pangkalan data yang kami cipta, dan yang terakhir dijana untuk membolehkan pangkalan data menyokong transaksi Fail log sementara! Saiz umum ialah 0 bait! Tetapi dalam File Explorer kami tidak boleh membuka fail, walaupun txt, apatah lagi .db! Jadi berikut adalah dua pilihan untuk anda:

  • 1 Eksportnya dahulu, dan kemudian gunakan alat grafik SQLite untuk melihatnya
  • 2. gunakan adb Shell untuk melihat (baris arahan, pasang pengkompil)!

Nah, izinkan saya tunjukkan kepada anda dua kaedah di atas, pilih sahaja yang anda suka~~


Kaedah 1: Gunakan Alat grafik SQLite untuk melihat db fail

Terdapat banyak perisian sedemikian Penulis menggunakan SQLite Expert Professional Sudah tentu, anda juga boleh menggunakan alat lain. Jika anda memerlukannya, anda boleh memuat turun: SQLiteExpert.zip

Eksport fail db kami ke desktop komputer, buka SQLiteExpert, antara muka adalah seperti berikut:

1.png

Jangan tanya saya cara main, import db dan main perlahan-lahan sendiri, penggunaannya sangat mudah, saya tidak faham Baidu~


Bagi yang kaedah kedua, saya pada asalnya ingin mencubanya, tetapi kemudian saya mendapati bahawa arahan sqlite tidak dapat dijumpai. Ayuh, cuba beberapa kali dan lupakannya. Ia akan digunakan kemudian dalam butang halus Jika anda berminat, anda boleh mencari "Barisan Kod Pertama - Android" Guo Lin dan mencubanya mengikut carta alir! Hanya bahagian pertama disiarkan di sini, baca bahagian arahan sendiri!

Kaedah 2: Baris arahan shell adb akan membawa anda berpura-pura dan terbang

1 Konfigurasikan pembolehubah persekitaran SDK:

Betul. -klik saya Komputer ——> Tetapan sistem lanjutan -> Pembolehubah persekitaran -> Pembolehubah sistem baharu -> -tools Salin laluan: Contohnya, pengarang: C:SoftwareCodingandroid-sdks-asplatform-tools

2.png

Sahkan, dan kemudian cari pembolehubah persekitaran daripada Laluan, Edit dan tambah pada penghujung: %SDK_HOME%;

3.png

Kemudian buka baris arahan, masukkan adb, swish swish sekumpulan perkara, ini bermakna konfigurasi berjaya!

——————Isi penting——————: Sebelum melaksanakan arahan baris arahan seterusnya, mungkin terdapat beberapa mesin untuk ujian anda: 1.Simulator asli: OK, langkau di sini dan teruskan. 2.Simulator Genymotion: Tiada masalah, Genymotion Shell tidak boleh melaksanakan arahan berikut 3.Mesin sebenar (berakar): Kemudian buka File Explorer dan lihat sama ada terdapat apa-apa dalam direktori data/data/? Tidak? Berikut ialah kaedah, iaitu memasang pengurus fail RE dahulu, kemudian berikan RE kebenaran Root, dan kemudian pergi ke direktori akar: Kemudian tekan lama direktori data, dan kotak dialog seperti ini akan muncul:

4.png10.png

5.png

Kemudian tunggu dia perlahan-lahan ubah suai kebenaran, dan pengubahsuaian selesai Akhirnya, kami membuka File Explorer DDMS sekali lagi, dan kami boleh melihat:

6.png

Baiklah, anda boleh lihat perkara dalam data/data! ———————————————————————

2 Masukkan shell adb, dan kemudian taip yang berikut arahan untuk Pergi ke direktori pangkalan data apl kami:

7.png

Kemudian masukkan arahan berikut mengikut urutan:

  • sqlite3 my.db: Buka fail pangkalan data
  • .table untuk melihat jadual yang ada dalam pangkalan data Kemudian anda boleh terus memasukkan pernyataan pangkalan data, seperti pertanyaan: Pilih * daripada orang
  • .schema: Lihat pernyataan penciptaan jadual
  • .quit : Keluar daripada pengeditan pangkalan data
  • .keluar: Keluar dari konsol peranti

...kerana sistem/bin/sh sqlite3: tidak dijumpai, Untuk masalah ini, arahan Sqlite berikutnya tidak boleh digunakan. Jika anda ingin melihat rendering, cuma semak buku Guo Daxia sendiri~ Tetapi di bawah kami masih mengeksport fail db dahulu, dan kemudian menggunakan grafik Alat pangkalan data untuk dilihat!


4 Gunakan API yang disediakan oleh Android untuk mengendalikan SQLite

Jika anda belum mempelajari sintaks berkaitan pangkalan data, atau anda malas dan tidak mahu menulis sintaks pangkalan data, anda boleh menggunakan Android give us Menyediakan beberapa kaedah API untuk mengendalikan pangkalan data Mari kita tulis contoh mudah untuk merangkumi penggunaan API ini.

Contoh Kod:

Penyampaian operasi:

8.gif

Kod pelaksanaan:

Reka letak terlalu mudah, hanya empat Butang, saya tidak akan menyiarkannya lagi, cuma siarkan kod MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Context mContext;
    private Button btn_insert;
    private Button btn_query;
    private Button btn_update;
    private Button btn_delete;
    private SQLiteDatabase db;
    private MyDBOpenHelper myDBHelper;
    private StringBuilder sb;
    private int i = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        myDBHelper = new MyDBOpenHelper(mContext, "my.db", null, 1);
        bindViews();
    }

    private void bindViews() {
        btn_insert = (Button) findViewById(R.id.btn_insert);
        btn_query = (Button) findViewById(R.id.btn_query);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_delete = (Button) findViewById(R.id.btn_delete);

        btn_query.setOnClickListener(this);
        btn_insert.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        db = myDBHelper.getWritableDatabase();
        switch (v.getId()) {
            case R.id.btn_insert:
                ContentValues values1 = new ContentValues();
                values1.put("name", "呵呵~" + i);
                i++;
                //参数依次是:表名,强行插入null值得数据列的列名,一行记录的数据
                db.insert("person", null, values1);
                Toast.makeText(mContext, "插入完毕~", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_query:
                sb = new StringBuilder();
                //参数依次是:表名,列名,where约束条件,where中占位符提供具体的值,指定group by的列,进一步约束
                //指定查询结果的排序方式
                Cursor cursor = db.query("person", null, null, null, null, null, null);
                if (cursor.moveToFirst()) {
                    do {
                        int pid = cursor.getInt(cursor.getColumnIndex("personid"));
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        sb.append("id:" + pid + ":" + name + "\n");
                    } while (cursor.moveToNext());
                }
                cursor.close();
                Toast.makeText(mContext, sb.toString(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_update:
                ContentValues values2 = new ContentValues();
                values2.put("name", "嘻嘻~");
                //参数依次是表名,修改后的值,where条件,以及约束,如果不指定三四两个参数,会更改所有行
                db.update("person", values2, "name = ?", new String[]{"呵呵~2"});
                break;
            case R.id.btn_delete:
                //参数依次是表名,以及where条件与约束
                db.delete("person", "personid = ?", new String[]{"3"});
                break;
        }
    }
}

5 Gunakan pernyataan SQL untuk mengendalikan pangkalan data

Sudah tentu, anda Anda mungkin telah mempelajari SQL dan boleh menulis pernyataan SQL yang berkaitan, tetapi anda tidak mahu menggunakan API yang disediakan oleh Android. Anda boleh terus menggunakan kaedah berkaitan yang disediakan oleh SQLiteDatabase:

  • execSQL(SQL,Object[]): Gunakan pernyataan SQL dengan ruang letak, ini adalah untuk melaksanakan dan mengubah suai pangkalan data. pernyataan sql kandungan menggunakan
  • rawQuery(SQL,Object[]): Gunakan operasi pertanyaan SQL dengan ruang letak Di samping itu, saya terlupa untuk memperkenalkan Curosr dan sifat-sifat berkaitan sebelum ini saya akan menambahnya di sini: ——Objek Kursor agak serupa dengan ResultSet dalam JDBC, set hasil penggunaannya adalah serupa Berikut ialah kaedah untuk mengalihkan penunjuk rekod hasil pertanyaan:
  • gerakkan(mengimbangi): Nyatakan bilangan baris untuk bergerak ke atas atau ke bawah, integer bermaksud bergerak ke bawah;
  • moveToFirst(): Penunjuk bergerak ke baris pertama dan berjaya mengembalikan true, yang juga menunjukkan bahawa terdapat data
  • moveToLast( ): Penunjuk bergerak ke Perkara terakhir ialah ia berjaya mengembalikan benar; !
  • moveToPrevious(): Beralih ke rekod sebelumnya
  • getCount( ) untuk mendapatkan jumlah bilangan data
  • isFirst(): Sama ada ia rekod pertama
  • isLast(): Sama ada ia rekod terakhir
  • moveToPosition (int) : Beralih ke baris yang ditentukan
  • Contoh kod:
1 Sisipkan data:
public void save(Person p)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("INSERT INTO person(name,phone) values(?,?)",
                new String[]{p.getName(),p.getPhone()});
}

2

public void delete(Integer id)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("DELETE FROM person WHERE personid = ?",
                new String[]{id});
}

3. Ubah suai data:

public void update(Person p)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("UPDATE person SET name = ?,phone = ? WHERE personid = ?",
        new String[]{p.getName(),p.getPhone(),p.getId()});
}

4 pertanyaan:

public Person find(Integer id)
{
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT * FROM person WHERE personid = ?",
            new String[]{id.toString()});
    //存在数据才返回true
    if(cursor.moveToFirst())
    {
        int personid = cursor.getInt(cursor.getColumnIndex("personid"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String phone = cursor.getString(cursor.getColumnIndex("phone"));
        return new Person(personid,name,phone);
    }
    cursor.close();
    return null;
}

5 Data paging:

public List<Person> getScrollData(int offset,int maxResult)
{
    List<Person> person = new ArrayList<Person>();
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT * FROM person ORDER BY personid ASC LIMIT= ?,?",
        new String[]{String.valueOf(offset),String.valueOf(maxResult)});
    while(cursor.moveToNext())
    {
        int personid = cursor.getInt(cursor.getColumnIndex("personid"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String phone = cursor.getString(cursor.getColumnIndex("phone"));
        person.add(new Person(personid,name,phone)) ;
    }
    cursor.close();
    return person;
}

6 >
public long getCount()
{
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT COUNT (*) FROM person",null);
    cursor.moveToFirst();
    long result = cursor.getLong(0);
    cursor.close();
    return result;      
}

PS

: Sebagai tambahan kepada kaedah di atas untuk mendapatkan bilangan item, anda juga boleh menggunakan kaedah cursor.getCount() untuk mendapatkan bilangan item data. Tetapi pernyataan SQL perlu diubah! Contohnya,

PILIH * DARI orang;

Ringkasan bahagian ini: Bahagian ini memperkenalkan anda kepada penggunaan asas terbina dalam Android SQLite, yang agak mudah Ya, kita akan mengkaji lebih sedikit dalam bahagian seterusnya. Perkara yang lebih maju, transaksi SQLite, cara memproses data dalam pangkalan data semasa mengemas kini aplikasi, dan cara menyimpan fail binari yang besar dalam pangkalan data kaedah! Okey, itu sahaja untuk bahagian ini~