日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

安卓内部存储之数据库存储

發布時間:2023/12/20 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓内部存储之数据库存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安卓內部存儲數據有多種方式,其中就有利用SQLite數據庫存儲的,今日這篇文章就來說說如何實現數據庫存儲?
一般我們實現數據庫存儲,主要做兩件事情,
第一件事情是創建一個數據庫,并且定義好我們想要的表結構,
第二件事情就是我們需要定義好實現對數據庫增刪改查的函數,以供外部調用.

在實現代碼之前,我們需要先來說明一下SQLITE數據庫是什么東東?
一般寫代碼的人都知道數據庫,也知道數據庫管理系統有ORACLE ,SQL SERVER ,和MYSQL 等等.
那么sqlite這是個什么玩意就容易比較理解了.簡單來說,它也是一個數據庫,它支持大多數的標準sql語言,你可以把它看作是跟oracle sql server 等價的數據庫也可以,只不過sqlite是在安卓手機內部存儲數據而已.
另外,有件事情我也不太確定,那就是sqlite是弱類型的數據庫,這個我是見過有一些材料這么說的,但是具體由于我沒有驗證過,所以不太確定,有興趣的朋友不妨可以去驗證驗證.

下面是代碼實現:
①首先是創建一個數據庫,并定義好我們需要的表結構.這里我定義的表就是一張課程表,里面只有兩個字段,分別是課程id 和 課程名字.
這里我們需要創建一個類并且繼承于sqliteopenhelper
`

package com.example.service;import android.content.Context; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;public class DataBaseHelper extends SQLiteOpenHelper {/*** 該方法用于創建數據庫, 其中name參數是數據庫的名字,這里設置為Course,* factory 是游標工廠,用來創建游標,我們可以設為null,意思就是使用系統默認的游標工廠* ,最后一個參數version是指數據庫的版本號,必須是大于0,不可以等于0,* 這里為了方便,我就將參數寫死,只保留一個context參數* * @param context* @param name* @param factory* @param version*/ public DataBaseHelper(Context context) {super(context, "Course.db", null, 1);// TODO 自動生成的構造函數存根//當版本號碼變為2的時候,就會調用onUpgrade方法// super(context, "Course.db", null, 2); }/*** 該方法在數據庫第一次被創建時候被調用,用于定義好表結構,*/ @Override public void onCreate(SQLiteDatabase db) {// TODO 自動生成的方法存根db.execSQL("create table courses (course_id Integer primary key autoincrement)"); }/*** 該方法是當數據庫的版本號發生改變時被調用,比如我現在版本號碼是1,當我版本號碼變為2的時候,就會調用該方法,該方法一般用于改變表結構*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO 自動生成的方法存根db.execSQL("alter table courses add course_name varchar(10)"); }}

`

②創建增刪改查等方法,以供調用
下面是另外創建一個類,名字為CourseService,并實現增刪改查等等方法.
為了方便,我們還需要創建一個JAVABEAN ,即是課程兩個屬性的類文件.

首先是JAVABEAN
`

package com.example.bean; import android.R.integer;public class Course {private Integer id; private String name; public Integer getId() {return id; } public void setId(Integer id) {this.id = id; } public String getName() {return name; } public void setName(String name) {this.name = name; }@Override public String toString() {return "Course [id=" + id + ", name=" + name + "]"; } public Course(Integer id,String name) {// TODO 自動生成的構造函數存根this.id=id;this.name=name; }public Course() {// TODO 自動生成的構造函數存根 }}

`

然后是增刪改查等等方法代碼:
`

package com.example.service;import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.example.bean.Course;public class CourseService {private DataBaseHelper helper;public CourseService(Context context) {// TODO 自動生成的構造函數存根helper=new DataBaseHelper(context); }/*** 插入數據* @param course_name* @throws Exception*/ public void insert(String course_name) throws Exception{SQLiteDatabase db=helper.getWritableDatabase();db.execSQL("insert into courses(course_name) values(?)",new Object[]{course_name});db.close(); }/*** 刪除數據* @param id* @throws Exception*/ public void delete(Integer id) throws Exception{SQLiteDatabase db=helper.getWritableDatabase();db.execSQL("delete from courses where course_id=?",new Object[]{id});db.close(); }/*** 更新數據* @param c* @throws Exception*/ public void update(Course c) throws Exception{SQLiteDatabase db=helper.getWritableDatabase();db.execSQL("update courses set course_name=? where course_id=?",new Object[]{c.getName(),c.getId()});db.close(); }/*** 查詢數據* @param id* @return* @throws Exception*/ public List<Course> query(Integer id) throws Exception{List<Course> courses=new ArrayList<Course>();SQLiteDatabase db=helper.getReadableDatabase();Cursor cursor= db.rawQuery("select * from courses", null);while(cursor.moveToNext()){Course cou=new Course();cou.setId(cursor.getInt(cursor.getColumnIndex("course_id")));cou.setName(cursor.getString(cursor.getColumnIndex("course_name")));courses.add(cou);}cursor.close();return courses;}/*** 分頁查詢數據* @param maxCount* @param offset* @return* @throws Exception*/ public List<Course> queryDivide(int maxCount,int offset) throws Exception{List<Course> courses=new ArrayList<Course>();SQLiteDatabase db=helper.getReadableDatabase();Cursor cursor= db.rawQuery("select * from courses limit ? offset ?",new String[]{String.valueOf(maxCount),String.valueOf(offset)});while(cursor.moveToNext()){Course cou=new Course();cou.setId(cursor.getInt(cursor.getColumnIndex("course_id")));cou.setName(cursor.getString(cursor.getColumnIndex("course_name")));courses.add(cou);}cursor.close();return courses;} }

`

實際上到這里,sqlite數據庫的如何使用,已經論述完了,但是數據庫避免不了一件事情,就是事務的原子性.
要么都做,要么都不做,這是數據庫的很重要的一件事情.
下面講述最后一個知識點,sqlite如何開啟一個事務.
代碼如下:
`

/*** 該方法只是一個demo而已,開啟一個事務,一次性添加兩門課程,分別是1111和2222,* 雖然這件事情毫無意義,但是開啟事務代碼就這么簡單,大家只需要將相關的代碼改改就好了* @throws Exception*/ public void insert2 () throws Exception{SQLiteDatabase db=helper.getWritableDatabase();db.beginTransaction();//開啟一個事務try{db.execSQL("insert into courses(course_name) values(?)",new Object[]{"1111"});db.execSQL("insert into courses(course_name) values(?)",new Object[]{"2222"});db.setTransactionSuccessful();//設置事務結束標志為true,因為事務結束有兩種情況,分別是commit 和rollback,若不將標識設為successful,那么事務結束時候不會提交,而是回滾}finally{db.endTransaction();//結束一個事務db.close();}}

`
好的,本文章要說的內容已經說完了.
最后一個友情提示:
大家知道自己創建的數據庫文件存放在哪里么?
打開模擬器,在路徑data/data/你創建數據庫文件的項目包/database/的下面就有你自己創建的數據庫文件了.
你可以將其導出來,利用SQLiteExpert來進行查看.

總結

以上是生活随笔為你收集整理的安卓内部存储之数据库存储的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。