• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Android學習筆記:數據庫----持久化存儲技術SQLite的基本使用方法

    標簽: Android  SQL  SQLite  使用方法

    通過項目實踐,來熟悉利用SQLiteDatabase來操作SQLite的基本用法。

    一、SQLite數據庫

    1、創建

    (1)、SQLite通過SQLiteOpenHelper幫助類來更方便的管理數據庫,SQLiteOpenHelper是一個抽象類,需要被繼承后實現自己的幫助類。
    (2)、SQLiteOpenHelper有兩個抽象方法需要重寫:onCreate()和onUpgrade(),即創建和升級方法。
    (3)、SQLiteOpenHelper的兩個實例方法(創建或打開一個現有的數據庫,并返回一個可對數據庫進行讀寫操作的對象):
      ①、getReadableDatabase():當數據庫不可寫入時(如磁盤空間已滿),返回的對象將以只讀的方式去打開數據庫。
      ②、getWritableDatabase():當數據庫不可寫入時(如磁盤空間已滿),出現異常。
    (4)、SQLiteOpenHelper的構造方法:
      SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
      參數一:上下文
      參數二:數據庫名
      參數三:返回一個自定義的Cursor
      參數四:版本號
    (5)、SQLite數據庫的數據類型:
      integer:整型
      real:浮點型
      text:文本類型
      blob:二進制類型
      另外:primary代表將當前字段設置為主鍵,autoincrement代表主鍵自增。

    若想創建一個名為BookStore的數據庫,并包含一個名為Book數據表,步驟如下。
    新建項目,DatabaseTest,新建MyDatabaseOpenHelper類并繼承DatabaseOpenHelper類,代碼如下:
    package com.my.databasetest;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.widget.Toast;
    
    public class MyDatabaseHelper extends SQLiteOpenHelper {
    
        private Context mContext;   //上下文
    
        //建表語句,表名:Book
        public static final String CREATE_BOOK = "create table Book ("
                + "id integer primary key autoincrement, "
                + "author text, "
                + "price real, "
                + "pages integer, "
                + "name text)";
    
        //構造函數
        public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, 
                                int version) {
            super(context, name, factory, version);
            mContext = context;
        }
    
        //創建方法
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_BOOK);
            Toast.makeText(mContext, "創建成功!", Toast.LENGTH_SHORT).show();
        }
    
        //升級方法
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    }
    修改activity_main.xml中的代碼:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <Button
            android:id="@+id/create_database"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="創建"
            />
    
    </LinearLayout>
    修改MainActivity中的代碼:
    package com.my.databasetest;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
        private MyDatabaseHelper myDatabaseHelper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //利用幫助類創建數據庫,數據庫名BookStore,版本號 1
            myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
    
            Button createDatabase = (Button)findViewById(R.id.create_database);
    
            //點擊事件,打開或創建數據庫
            createDatabase.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    myDatabaseHelper.getWritableDatabase();
                }
            });
    
        }
    
    
    }
    運行程序:

    再次點擊不會出現Toast提示,因為數據庫已經創建。

    查看已創建的數據庫中的數據:

    Tools\Android\Android Device Monitor,在新出現的窗口中點擊File Explorer,data\data\當前項目包名\databases目錄下,可以看到數據庫,但是無法查看其中具體的數據。


    另一種方法:

    將sdk的platform-tools配置到環境變量中(安裝SDK時就應該將此目錄配置到環境變量中,Android Studio自帶的SDK會自動配置環境變量,但是不會配置該目錄,仍需手動配置),里面是SDK自帶的adb調試工具。

    1、進入控制臺,輸入adb shell,進入設備控制臺。

    2、使用cd命令進入當前項目的databases目錄,然后輸入ls進行查看。

    3、借助sqlite命令打開數據庫:sqlite3 + 數據庫名

    4、輸入 .table 查看數據表。

    5、還可以通過 .schema 來查看建表語句。


    2、升級

    幫助類中,重寫的onUpgrade()方法就是用來升級數據庫的方法。
    需求:在當前項目的數據庫中新添加一個用于記錄圖書分類的Category表。

    修改MyDatabaseHelper類代碼:

    (1)、在原來的Book建表語句下新增以下代碼:

        //建表語句,表名:Category
        public static final String CREATE_CATEGORY = "create table Category ("
                + "id integer primary key autoincrement, "
                + "category_name text, "
                + "category_code integer)";
    (2)、修改onCreate()代碼:
        //創建方法
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_BOOK);
            db.execSQL(CREATE_CATEGORY);
            Toast.makeText(mContext, "創建成功!", Toast.LENGTH_SHORT).show();
        }
    (3)、在onUpgrade()方法中新增以下代碼:
        //升級方法
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("drop table if exists Book");
            db.execSQL("drop table if exists Category");
            onCreate(db);
        }
    (4)、在MainActivity中,將創建數據庫語句的參數,版本號改為2.
        //利用幫助類創建數據庫,數據庫名BookStore,版本號 1,升級后版本號 2
        myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);

    升級方法中使用DROP語句,若存在Book表,刪除,若存在Category表,刪除,然后調用onCreate()方法,重新建表。

    運行程序后,點擊創建按鈕,會重新彈出Toast提示。使用adb工具查看。


    3、添加數據

    (1、)打開或創建數據庫時,會使用到getReadableDatabase()方法或getWritableDatabase()方法。這兩個方法都會返回一個SQLiteDatabase對象,通過該對象中專有的insert()方法可以實現向數據庫中添加數據。
    (2)、insert()方法:insert(String table, String nullColumnHack, ContentValues values) 
      參數一:表名。
      參數二:用于在未指定添加數據的情況下給某些可為空的列自動賦值null,一般用不到,可以傳入null。
      參數三:ContentValues對象,數據載體,通過put()方法添加數據,利用這個對象將所有數據寫入數據庫。

    修改activity_main.xml文件,新增一個按鈕。
        <Button
            android:id="@+id/add_data"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="添加"
            />
    修改MainActivity的createDatabase點擊事件下添加一下代碼:
        Button addData = (Button)findViewById(R.id.add_data);
    
        //點擊事件,新增數據
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
    
                //開始組裝第一條數據
                values.put("name","The Da Vinci Code");
                values.put("author","Dan Brown");
                values.put("pages",454);
                values.put("price",16.96);
    
                db.insert("Book",null,values);
    
                values.clear();
    
                //開始組裝第二條數據
                values.put("name","The Lost Symbol");
                values.put("author","Dan Brown");
                values.put("pages",510);
                values.put("price",19.95);
                    
                db.insert("Book",null,values);
            }
        });
    運行程序后,點擊“添加”按鈕,然后查看數據庫中的數據。

    4、更新數據

    (1)、更新數據可以使用到SQLiteDatabase中的update()方法。
    (2)、update()方法:update(String table, ContentValues values, String whereClause, String[] whereArgs) 
      參數一:表名。
      參數二:ContentValues對象,用來存儲需要更新的數據。
      參數三、參數四:用于約束更新某一行或某幾行中的數據,不指定,默認更新所有行。

    修改activity_main.xml文件,新增一個按鈕。
        <Button
            android:id="@+id/update_data"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="更新"
            />
    修改MainActivity中的代碼,在addData的點擊事件下,新增一下代碼:
        Button updateData = (Button)findViewById(R.id.update_data);
    
        //點擊事件,更新數據
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
    
                values.put("price",10.99);
    
                //更新方法,將書名為The Da Vinci Code的價格更改為values中的數據
                db.update("Book",values,"name = ?",new String[] {"The Da Vinci Code"});
            }
        });
    運行程序,點擊更新,查看數據庫中的數據。

    可以看到書的價格已經與上一次運行的結果不同了,16.96 -> 10.99

    5、刪除數據

    (1)、刪除數據可以用到SQLiteDatabase中的delete()方法。
    (2)、delete()方法:
      參數一:表名。
      參數二、參數三:用于約束刪除某一行還是刪除某幾行的數據,不指定,默認刪除所有行。

    修改activity_main.xml文件,新增一個按鈕。
        <Button
            android:id="@+id/delete_data"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="刪除"
            />
    修改MainActivity中的代碼,在update點擊事件的下面添加以下代碼:
        Button deleteData = (Button)findViewById(R.id.delete_data);
    
        //點擊事件,刪除數據
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
    
                //刪除方法,將Book表中pages大于500的數據整行刪除。
                db.delete("Book","pages > ?",new String[] {"500"});
            }
        });
    運行程序,點擊刪除,查看數據庫中的數據。

    可以看到,對比與上一次運行結果,大于500頁的書籍已經被刪除了。

    6、查詢數據

    (1)、查詢數據可以用到SQLiteDatabase中的query()方法。
    (2)、query()方法有三個:
      ①、query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
      ②、query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 
      ③、query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
      其中參數最少的也有7個之多,以這個方法為例,查看它的參數及含義。
      
      三個方法都會返回Cursor對象,查詢到的所有數據都從該對象中取出。

    修改activity_main.xml文件,添加一個按鈕。
        <Button
            android:id="@+id/query_data"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="查詢"
            />
    修改MainActivity中的代碼,在deleteData的點擊事件下添加以下代碼:
        Button queryData = (Button)findViewById(R.id.query_data);
    
        //點擊事件,查詢數據
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
    
                //查詢Book表中的所有數據
                Cursor cursor = db.query("Book",null,null,null,null,null,null);
                if(cursor.moveToFirst()){
                    do{
                        //遍歷Cursor對象,取出數據并打印
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));
                        Log.d("MainActivity", "book name is " + name);
                        Log.d("MainActivity", "book author is " + author);
                        Log.d("MainActivity", "book pages is " + pages);
                        Log.d("MainActivity", "book price is " + price);
                    }while(cursor.moveToNext());
                }
                cursor.close();
            }
        });
    
    運行程序:

    點擊查詢,查看Logcat輸出:

    對于十分熟悉SQL的工作者來說,使用SQL的查詢語句非常順手,當然,Android也可以使用SQL的語句查詢。例如:
    (1)、添加數據語句:
    db.execSQL("insert into Book (name,author,pages,price) values(?,?,?,?)",new String[] {"The Da Vinci Code","Dan Brown","454",16.96});
    (2)、更新數據語句:
    db.execSQL("update Book set price = ? where name = ?",new String[] {"10.99","The Da Vinci Code"});
    (3)、刪除數據語句:
    db.execSQL("delete from Book where pages > ?",new String[] {"500"});
    (4)、查詢數據語句:
    db.rawQuery("select * from Book",null);



    以上總結自郭神(郭霖)《第一行代碼 第二版》并做了少量修改。

    版權聲明:本文為Lone1yCode原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Lone1yCode/article/details/79311270

    智能推薦

    Android使用已有sqlite數據庫——內部存儲

    ——熱愛開源,樂于分享 Android使用已有sqlite數據庫——內部存儲 上一篇介紹了如何在手機sd卡上使用已有的sqlite數據庫,但是如果手機沒有sd卡這個外部存儲,則怎么實現呢?今天講述使用Android手機內部存儲使用已有的sqlite數據庫。 一、拷貝數據庫文件到當前工程 拷貝到res/raw下: 二、代碼: 這是我在利用Android...

    Android存儲之SQLite數據庫

    Android存儲之SQLite數據庫數據庫 創建數據庫 操作數據庫 查看數據庫...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    猜你喜歡

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡