国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

sqlite應用1

2019-11-09 16:29:37
字體:
來源:轉載
供稿:網友

SQLite是一款輕量級的關系型數據庫,它的運行速度很快,占用資源少,通常只需要幾百K的內存就足夠了,因而現在的主流移動設備都使用SQLite作為復雜數據的存儲引擎。對于Android來說,系統內置了豐富的API來提供開發人員操作SQLite,從而輕松的實現數據的操作。

創建數據庫

SQLite 數據類型

integer — 整型 real—浮點型 text—文本類型 blob—二進制類型

新建一個類MyDatabaseHelper 繼承自SQLiteOpenHelper (Android為我們專門提供的一個幫助類)

public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" + //PRimary key 將id列設為主鍵 autoincrement表示id列是自增長的 "id integer primary key autoincrement," + "author text," + "price real," + "name text)"; private Context mContext;//構造方法:第一個參數Context,第二個參數數據庫名,第三個參數cursor允許我們在查詢數據的時候返回一個自定義的光標位置,一般傳入的都是null,第四個參數表示目前庫的版本號(用于對庫進行升級) public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory , int version){ super(context,name ,factory,version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { //調用SQLiteDatabase中的execSQL()執行建表語句。 db.execSQL(CREATE_BOOK); //創建成功 Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}123456789101112131415161718192021222324252627282930313233

更改studio 生成的自動布局文件(activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.scott.sqlitetest.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/create_database" android:text="Create database"/></LinearLayout>123456789101112131415

修改MainActivity中的代碼:

public class MainActivity extends AppCompatActivity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = 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) {//創建或打開現有的數據庫 dbHelper.getWritableDatabase(); } }); }}1234567891011121314151617181920

SQLiteOpenHelper中的兩個非常重要的實例方法。getReadableDatabase()和getWriteableDatabase(),這兩個方法都可以創建和打開一個現有的數據庫,區別在于當數據庫不可寫入的時候getReadableDatabase()方法返回的對象將以只讀的方式去打開數據庫,而getWriteDatabase()將出現異常

到這里我們的數據庫已經創建完成了運行效果如圖: 這里寫圖片描述 如圖當我們第一次點擊create database的時候會彈出Toast消息,,再次點擊的時候就不會出現了說明沒有運行oncreate 數據庫已經創建完成了。 那怎么才能找到這個文件呢??? 我電腦是windows 10 需要先配置環境變量 如圖我們只要在系統變量中選擇path單擊編輯 然后選擇新建,目錄為你android SDK 中platform-tools 平臺工具的文件夾 配置好后我們就可以使用文件夾中的adb工具和sqlite3 工具了 這里寫圖片描述 使用adb 工具 這里寫圖片描述 首先輸入adb shell 進入到設備控制臺。 然后使用cd 命令進行到/data/data/com.example.scott.sqlitetest/databases/目錄下用 ls 命令查看該目錄里的文件; 然后借助sqlite命令打開數據庫,使用.table 查看數據庫中有哪些表,(android_metadata 是每個數據庫都會自動生成的),使用.schema 查看建表語句。最后輸入 .exit 或 .quit 退出。

升級數據庫

數據庫升級其實很簡單,我們只要更改SQLiteOpenHelper中構造方法的第四個參數,即當前數據的版本號,只要比之前傳入的數值大就可以了。 現在我想在之前的數據庫中加上一列為Category 來記錄書籍的分類。 繼續在MyDatabaseHelper 類中添加一條建表語句:

...... public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement," + "category_name text," + "category_code integer)";...... public void onCreate(SQLiteDatabase db) { //調用SQLiteDatabase中的execSQL()執行建表語句。 db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); }...... public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //如果Book、Category表已存在則刪除表 db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); }123456789101112131415161718192021222324

設置好MyDatabaseHelper類之后,我們就可以在MainActivity中將版本號改為2 即( dbHelper = new MyDatabaseHelper(this , “BookStore.db” , null , 2 );),就可以對數據庫進行升級了。

與上一節一樣查看數據庫是否創建正確。如圖 這里寫圖片描述我們可以看到數據庫是實現了升級; 注意圖中紅色標記區域是因為我電腦上開了虛擬機,然后手機又是調試狀態。一般情況下我都是使用真機調試


到這里我們的數據庫建完了,還沒有向表中添加數據。但是我們仔細看上面的數據庫的的升級的時候可能發現一個問題,在升級的時候會將之前的表刪除掉,那么之前表中保存的數據也會一并刪除掉,造成以前程序存儲在本地的數據全部丟失。那么怎樣才能在升級數據庫的時候不刪除之前的表呢,我會在下一篇博文(Android Studio SQLite數據庫應用(二))中寫 SQLite事務處理的時候一并寫一下。數據庫升級的最佳寫法

CRUD數據操作

CRUD—C (create) R(retrieve ) U(update) D(delete)

添加數據

先看代碼: 在布局文件中加一個按鍵:

<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/add_data" android:text="Add Data"/>12345

修改MainActivity 如下:

public class MainActivity extends AppCompatActivity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = 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) { dbHelper.getWritableDatabase(); } }); Button addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {//getWritableDatabase()會返回一個SQLiteDatabase對象 SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name","The Da Vinci Code"); values.put("price",20); values.put("pages",600); values.put("author","Scott"); //insert()方法中第一個參數是表名,第二個參數是表示給表中未指定數據的自動賦值為NULL。第三個參數是一個ContentValues對象 db.insert("Book",null,values); values.clear(); values.put("name","The Lost Symbol"); values.put("author","Scott"); values.put("pages",500); values.put("price",30); db.insert("Book",null,values); } }); }}12345678910111213141516171819202122232425262728293031323334353637383940414243

在上面的代碼中只對Book表中的四列數據進行了組裝,id那一列并沒有給它賦值,因為在之前將id列設置為自增長了。 接下來我們來看看表中是不是真的有數據。 這里寫圖片描述

輸入 select * from Book;查詢表中的內容,在我沒有按 Add Create 的時候 顯示為空,按了之后,表中有了數據。

更新數據

SQLitedatabase 提供了update()用于數據的更新。

在activity_main.xml 增加一個按鍵,這里就不寫了。在MainActivity中怎么按鍵監聽 ,用于數據更新。

Button updateData = (Button) findViewById(R.id.update_data); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("price",19.99); //仔細update中提示的參數(String table,ContentValues,String whereClause,String[] whereArgs) //第三滴四行指定具體更新那幾行。注意第三個參數中的?是一個占位符,通過第四個參數為第三個參數中占位符指定相應的內容。 db.update("Book",values,"name=?",new String[]{"The Da Vinci Code"}); } });123456789101112

這里寫圖片描述

OK 更新成功。

刪除數據

刪除數據很簡單,SQLiteDatabase 提供了delete() 方法用于刪除數據。這里就不寫代碼了具體講一下什么意思 delete(String table, String whereClause, String [] whereArgs)

舉個例子 delete(“Book”,”name=?”,new String[] {“The Da Vinci Code”}); 就是把名字為The Da Vinci Code 這本書的數據都刪除。 再比如:delete(“Book”,”price > ?”,new String[] {“20”}); 意思就是把價格大于20 的所有的書都刪掉。 哈哈還是很好玩的,想刪什么刪什么,但是要注意了 如果你第二,第三個參數不指定的話,就會刪除所有行。

查詢數據

對于SQLite的查詢功能這邊我只簡單介紹一下,因為前面的“增刪減”只是SQLite 功能的一小部分。我想后面單獨詳細介紹一下SQLite的查詢功能。

同樣,SQLiteDatabase 中提供了 query()方法用于對數據進行查詢。 方法中的參數: query(String table , String [] columns , String selection , String [] selectionArgs , String groupBy , String having , String orderBy ); table —指定查詢的表名 columns —指定查詢的列名 selection —指定where的約束條件 selectionArgs — 為where中的占位符提供具體的值 groupBy — 指定需要 groupBy 的列 having — 對groupBy后的結果進一步約束 orderBy — 指定查詢結果的排序方式

Button queryButton = (Button) findViewById(R.id.query_data); queryButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); //指明去查詢Book表。 Cursor cursor = db.query("Book",null,null,null,null,null,null); //調用moveToFirst()將數據指針移動到第一行的位置。 if (cursor.moveToFirst()){ do { //然后通過Cursor的getColumnIndex()獲取某一列中所對應的位置的索引 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(); } });123456789101112131415161718192021222324

結果如圖: 這里寫圖片描述

好了到這里就結束了,下一篇 寫數據庫的事務處理,還有那什么 數據庫升級的最佳方式。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒙山县| 外汇| 岚皋县| 肇庆市| 册亨县| 丰台区| 仙桃市| 河北区| 浦城县| 江安县| 远安县| 麦盖提县| 扎赉特旗| 筠连县| 紫金县| 抚松县| 天津市| 大竹县| 濉溪县| 光山县| 河曲县| 洪湖市| 新平| 长垣县| 宁明县| 南部县| 定西市| 酉阳| 五常市| 东光县| 通辽市| 乌什县| 会理县| 浏阳市| 晋中市| 澄迈县| 来宾市| 宾川县| 竹溪县| 长宁区| 桦甸市|