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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

[Android]SQLite的使用

發(fā)布時間:2023/12/13 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Android]SQLite的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android 數(shù)據(jù)存儲提供了四種存儲方式:

  • Shared Preferences

    使用鍵值對(Map(key, value))來存儲數(shù)據(jù)
  • Internal Storage

    內(nèi)部存儲,存儲在設(shè)備內(nèi)存的 私人數(shù)據(jù)
  • External Storage

    外部存儲,存儲在外部設(shè)備的 公共數(shù)據(jù)
  • SQLite Databases

    存儲在關(guān)系型數(shù)據(jù)庫;SQLite 是類似MySQL 的關(guān)系型數(shù)據(jù)庫,因?yàn)槠潴w較小,功能全,被運(yùn)用在了大多嵌入式設(shè)備

    Network Connection

SQLite 簡介

非常小的關(guān)系型數(shù)據(jù)庫

SQLiteOpenHelper

CRUD(增刪改查)

import android.app.Activity; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button;public class SimpleActivity extends Activity {private static final String INFO = "SimpleActivity";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.simple_layout);Log.i(INFO, INFO);SQLiteDatabase db = openOrCreateDatabase("simple.db", Context.MODE_PRIVATE, null);db.execSQL("DROP TABLE IF EXISTS Person");// 創(chuàng)建表db.execSQL("CREATE TABLE Person ("+ " id INTEGER PRIMARY KEY AUTOINCREMENT,"+ " name varchar(30),"+ " age SMALLINT"+ ")");Log.d(INFO, "Create Table Successful");Person person = new Person();person.name = "Tikitoo";person.age = 23;// 插入數(shù)據(jù)db.execSQL("INSERT INTO Person VALUES(NULL , ?, ?)", new Object[]{person.name, person.age});Log.d(INFO, "Insert Successful");person.name = "Davin";person.age = 30;ContentValues cv = new ContentValues();cv.put("name", person.name);cv.put("age", person.age);// 插入ContentValue 中的數(shù)據(jù)db.insert("Person", null, cv);Log.d(INFO, "ContentValues Insert Successful");cv = new ContentValues();cv.put("age", 35);// 更新數(shù)據(jù)db.update("Person", cv, "name = ?", new String[]{"Davin"});Log.d(INFO, "Update Successful");Cursor cursor = db.rawQuery("SELECT * FROM Person", null);while (cursor.moveToNext()) {int id = cursor.getInt(cursor.getColumnIndex("id"));String name = cursor.getString(cursor.getColumnIndex("name"));int age = cursor.getInt(cursor.getColumnIndex("age"));Log.d("INFO", id + name + age);}Log.d(INFO, "Query Successful");cursor.close();db.delete("Person", "age < ?", new String[]{"25"});Log.d(INFO, "Delete Successful");db.close();// deleteDatabase("tikitoo_sqlite.db");} }

參考:

Android SQLite Database Tutorial
Android中SQLite應(yīng)用詳解 - scott's blog - 博客頻道 - CSDN.NET

問題總結(jié)

使用SQLite 調(diào)試工具ADB(adb)

(android:adb環(huán)境變量的配置)[http://blog.csdn.net/huangbiao86/article/details/6664779]
使用ADB 工具查看adb shell

cd data,ls 出現(xiàn)錯誤,這是,輸入su 回車即可,會請求訪問權(quán)限,在手機(jī)同意一下;
adb opendir failed ,permission denied


當(dāng)然Android 對于SQLite 處理封裝的對象 SQLiteOpenHelper 來返回 SQLiteDatabase 對象來實(shí)現(xiàn)增刪改查
我們再開發(fā)的時候,不能像上面寫得那么簡單,需要對封裝一個子類,提供SQLiteOpenHelper 對象;

封裝的SQLiteOpenHelper 對象

package com.tikitoo.android.sqlite.util;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;/*** Created by Tikitoo1 on 2014/11/12.*/ public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "test.db";private static final int DATABASE_VERSION = 1;public DBHelper(Context context) {// 設(shè)置SQLiteDatabase.CursorFactory 為nullsuper(context, DATABASE_NAME, null, DATABASE_VERSION);}// 數(shù)據(jù)庫第一次創(chuàng)建被調(diào)用@Overridepublic void onCreate(SQLiteDatabase db) {// 初始化創(chuàng)建一個表db.execSQL("CREATE TABLE IF NOT EXISTS Person"+ "(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(30), age SMALLINT");}// 如果數(shù)據(jù)庫版本改變,則會調(diào)用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 新增一個字段db.execSQL("ALTER TABLE Person ADD COLUMN other STRING");} }

DatabaseSQLite 對象實(shí)現(xiàn)對數(shù)據(jù)庫的增刪改查

import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log;import java.util.ArrayList; import java.util.List;public class DBManager {private static final String INFO = DBManager.class.toString();private DBHelper helper;private SQLiteDatabase db;public DBManager(Context context) {helper = new DBHelper(context);db = helper.getWritableDatabase();// helper.getReadableDatabase();}// 新增一條數(shù)據(jù),將數(shù)據(jù)存在Person 對象,在放在List 集合中,遍歷集合,可以實(shí)現(xiàn)多條數(shù)據(jù)插入;public void add(List<Person> persons) {db.beginTransaction();try {for (Person person : persons) {db.execSQL("INSERT INTO Person VALUES(NULL, ?, ?, ?)",new Object[]{person.name, person.age, person.info});}// 設(shè)置事物db.setTransactionSuccessful();} finally {// 結(jié)束事物db.endTransaction();}}// 更新一條數(shù)據(jù),通過name 來修改agepublic void update(Person person) {ContentValues cv = new ContentValues();cv.put("age", person.age);cv.put("info", person.info);// 參數(shù),(表名, ContentValues 對象, where 條件,where 條件對應(yīng)的值)db.update("Person",cv, "name = ?", new String[]{person.name});}public void delete(Person person) {db.delete("Person", "age >= ?", new String[]{"" + person.age});// String.valueOf(person.age);}public List<Person> person() {List<Person> lists = new ArrayList<Person>();// 使用rawQuery() 方法,返回游標(biāo)對象,遍歷出數(shù)據(jù)庫的數(shù)據(jù)Cursor cursor = db.rawQuery("SELECT * FROM Person", null);while (cursor.moveToNext()) {int _id = cursor.getInt(cursor.getColumnIndex("id"));String name = cursor.getString(cursor.getColumnIndex("name"));int age = cursor.getInt(cursor.getColumnIndex("age"));String info = cursor.getString(cursor.getColumnIndex("info"));Log.i(INFO, new Person(_id, name, age, info).toString());}return lists;}// 關(guān)閉數(shù)據(jù)庫public void closeDB() {db.close();} }

對了還有將數(shù)據(jù)表使用JavaBean 處理,將數(shù)據(jù)存儲在Person 對象,比較方便

public class Person {public int _id; // id,唯一標(biāo)識public String name; // 姓名public int age; // 年齡public String info; // 備注信息public Person() {}public Person(String name, int age, String info) {this.name = name;this.age = age;this.info = info;}public Person(int _id, String name, int age, String info) {this._id = _id;this.name = name;this.age = age;this.info = info;}// 重寫toString() 方法@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("Person[ ");sb.append("name = " + this.name);// sb.append("; id = " + _id);sb.append("; age = " + this.age);sb.append("; info = " + this.info);sb.append(" ]");return sb.toString();} }

getReadableDatabase() 和getWritableDatabase() 方法的區(qū)別:

getReadableDatabase:

首先判斷數(shù)據(jù)庫實(shí)例是否是打開狀態(tài),
如果是,則打開一個可讀寫的數(shù)據(jù)庫實(shí)例;
如果遇到磁盤已滿,獲取失敗,再以可讀模式打開數(shù)據(jù)庫,返回?cái)?shù)據(jù)庫實(shí)例

getWritableDatabase:

如果不為空,已經(jīng)打開,并不是以只讀模式打開的,
如果mDatabase 不為空則加鎖,然后創(chuàng)建或打開新的數(shù)據(jù)庫實(shí)例,比較版本,為數(shù)據(jù)庫設(shè)置新的版本號,最后把不為空的mDatabase 解鎖,把新創(chuàng)建的數(shù)據(jù)庫實(shí)例賦值給 mDatabase,并返回新的實(shí)例;

總結(jié)

所以,如果不遇到磁盤已滿的情況下,兩個方式返回的數(shù)據(jù)庫實(shí)例是一樣的,如果擔(dān)心這種方式發(fā)生,先調(diào)用 getWritableDatabase 方法,
如果異常,則在調(diào)用 getReadableDatabase ,當(dāng)然這個時候的數(shù)據(jù)庫實(shí)例是只讀的

轉(zhuǎn)載于:https://www.cnblogs.com/zhousysu/p/5483874.html

總結(jié)

以上是生活随笔為你收集整理的[Android]SQLite的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。