[Android]SQLite的使用

Android 數據存儲提供了四種存儲方式:

  • Shared Preferences

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

      內部存儲,存儲在設備內存的 私人數據 
  • External Storage

      外部存儲,存儲在外部設備的 公共數據 
  • SQLite Databases

      存儲在關系型數據庫;SQLite 是類似MySQL 的關系型數據庫,因為其體較小,功能全,被運用在了大多嵌入式設備 

    Network Connection

SQLite 簡介

非常小的關系型數據庫

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");// 創建表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;// 插入數據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 中的數據db.insert("Person", null, cv);Log.d(INFO, "ContentValues Insert Successful");cv = new ContentValues();cv.put("age", 35);// 更新數據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應用詳解 - scott's blog - 博客頻道 - CSDN.NET

問題總結

使用SQLite 調試工具ADB(adb)

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

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


當然Android 對于SQLite 處理封裝的對象 SQLiteOpenHelper 來返回 SQLiteDatabase 對象來實現增刪改查
我們再開發的時候,不能像上面寫得那么簡單,需要對封裝一個子類,提供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) {// 設置SQLiteDatabase.CursorFactory 為nullsuper(context, DATABASE_NAME, null, DATABASE_VERSION);}// 數據庫第一次創建被調用@Overridepublic void onCreate(SQLiteDatabase db) {// 初始化創建一個表db.execSQL("CREATE TABLE IF NOT EXISTS Person"+ "(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(30), age  SMALLINT");}// 如果數據庫版本改變,則會調用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 新增一個字段db.execSQL("ALTER TABLE Person ADD COLUMN other STRING");}
}

DatabaseSQLite 對象實現對數據庫的增刪改查


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();}// 新增一條數據,將數據存在Person 對象,在放在List 集合中,遍歷集合,可以實現多條數據插入;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});}// 設置事物db.setTransactionSuccessful();} finally {// 結束事物db.endTransaction();}}// 更新一條數據,通過name 來修改agepublic void update(Person person) {ContentValues cv = new ContentValues();cv.put("age", person.age);cv.put("info", person.info);// 參數,(表名, ContentValues 對象, where 條件,where 條件對應的值)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() 方法,返回游標對象,遍歷出數據庫的數據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;}// 關閉數據庫public void closeDB() {db.close();}
}

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

public class Person {public int _id;     // id,唯一標識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() 方法的區別:

getReadableDatabase:

首先判斷數據庫實例是否是打開狀態,
如果是,則打開一個可讀寫的數據庫實例;
如果遇到磁盤已滿,獲取失敗,再以可讀模式打開數據庫,返回數據庫實例

getWritableDatabase:

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

總結

所以,如果不遇到磁盤已滿的情況下,兩個方式返回的數據庫實例是一樣的,如果擔心這種方式發生,先調用 getWritableDatabase 方法,
如果異常,則在調用 getReadableDatabase ,當然這個時候的數據庫實例是只讀的

轉載于:https://www.cnblogs.com/zhousysu/p/5483874.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255349.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255349.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255349.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第一百四十五節,JavaScript,同步動畫

JavaScript&#xff0c;同步動畫 將上一節的&#xff0c;移動透明動畫&#xff0c;修改成可以支持同步動畫&#xff0c;也就是可以給這個動畫方法多個動畫任務&#xff0c;讓它同時完成 原理&#xff1a; 向方法里添加一個屬性&#xff0c;這個屬性是一個對象&#xff0c;同步動…

Exchange Server 2016管理系列課件39.新建本地移動請求

場景通過新建本地移動請求&#xff0c;可以很方便的將用戶郵箱從一個數據庫遷移到另外一個數據庫。1&#xff09;跨平臺郵件遷移&#xff1b;&#xff08;低exchange遷移到高版本exchange&#xff09;2&#xff09;數據庫平衡與優化&#xff1b;&#xff08;企業當中&#xff0…

【數據庫學習】——【匯總】MySQL數據庫下載與安裝(Msi文件安裝和免安裝版本)、Navicat下載與安裝

目錄 1、MySQL數據庫下載與安裝 1&#xff09;MySQL數據庫下載 MySQL官網 MySQL數據庫下載 2&#xff09;MySQL 通過msi文件安裝 3&#xff09;MySQL免安裝版本使用 1&#xff09;將免安裝包移動到安裝的文件夾位置&#xff1b; 2&#xff09;新建data文件夾 3&#xff…

Val編程-文本操作

Val系統相對于高級語言來說&#xff0c;對于文本操作的功能相當的弱。 一般的文本&#xff08;文件夾&#xff09;操作有&#xff1a; 1.新建文本&#xff0c; 2.刪除文本&#xff0c; 3.新建文件夾&#xff0c; 4.刪除文件夾&#xff0c; 5.文本重命名&#xff0c; 6.文…

Linux高級編程--01.vi命令

VI是Linux/Unix下標配的一個純字符界面的文本編輯器。由于不支持鼠標功能&#xff0c;也沒有圖形界面&#xff0c;相關的操作都要通過鍵盤指令來完成&#xff0c;需要記憶大量命令。因此很多人不大喜歡它&#xff0c;但同時由于鍵盤的方式往往比鼠標來得快&#xff0c;一旦熟練…

【數據庫學習】——糾錯:mysql Authentication plugin ‘caching_sha2_password‘ is not supported

目錄 1、環境介紹 2、問題描述 3、原因分析 4、 解決方案 1&#xff09;方法一&#xff1a;直接改成mysql_native_password驗證方式 2&#xff09;方案二&#xff1a; 利用sql命令將驗證機制修改 ① 打開命令行窗口——cmd ② 登錄mysql數據庫 ③ 查看不同用戶名的身份…

xcode中用pods管理第三方庫轉

安裝pods &#xff1a;http://www.cnblogs.com/wangluochong/p/5567082.html 史上最詳細的CocoaPods安裝教程 --------------------------------------------- 第一步&#xff1a;Cmmand&#xff0b;空格&#xff0c;搜索"終端"&#xff0c;使用cd命令進入到我們項目…

Val編程-界面編程

由于示教盒是一個黑白的分辨率為&#xff08;14*40&#xff09;的液晶屏&#xff0c;用戶交互不是很好&#xff0c;界面不友好。而且沒有鼠標導航與觸摸屏。 界面編程函數 1.void cls() 2.void title(string sText) 3.void put(string sText), void put(num nValue) 4.void put…

【機器學習筆記四】分類算法 - 邏輯回歸

參考資料 【1】 Spark MLlib 機器學習實踐 【2】 統計學習方法 1、Logistic分布 設X是連續隨機變量&#xff0c;X服從Logistic分布是指X具有下列分布函數和密度函數 &#xff0c;。其中u為位置參數&#xff0c;γ為形狀參數。如下圖&#xff1a; 分布函數以(u,1/2)為中心…

FPFH+ICP點云配準

A, UniformSampling降噪B, ISS計算關鍵點, FPFH特征在FeatureCloud::setInputCloud中讀入點云,并調用processInput進行處理:processInput處理包括: 1, computeSurfaceNormals () 使用NormalEstimation計算得到表面法向量2, computeLocalFeatures () FPFHEstimationKdTreeIS…

【python 學習】——pycharm終端解釋器和Python解釋器配置

目錄 1、pycharm終端運行的時候前面帶有PS&#xff0c;是什么意思&#xff0c;怎么變成cmd? 1&#xff09;File——settings 2&#xff09;tools——terminal——shellPath 2、pycharm怎么切換不同的Python解釋器&#xff1f; 1&#xff09;File——settings 2&#xff09…

在linux下實現mysql自動備份數據

使用的系統為CentOS&#xff0c;mysql版本為5.6 備份功能主要利用以下功能實現&#xff1a; mysql命令中的mysqldump命令 linux下腳本編寫 linux下crontab定時任務的使用 首先確定你要存放腳本的目錄和存放備份數據的目錄 首先進行以下修改&#xff08;因為在命令行或者腳本中寫…

面向未來編程

我們一直以來都知道面向對象編程&#xff0c;面向過程編程。大多數時候還是面向工資編程&#xff0c;面向生活編程。面向任務編程&#xff0c;面向公司編程&#xff0c;面向領導編程。 工資不給力&#xff0c;心里認為委屈&#xff1b;生活有壓力。影響工作情緒。任務完畢就好…

Plotclock

調試程序&#xff0c;運行調試程序&#xff0c;舵機會移動兩只懸臂分別停留在一只水平另一只垂直的位置上。如果差距非常大&#xff0c;可拆下懸臂調節&#xff0c;如果比較接近了&#xff0c;就修改程序第3~6行的四個參數 SERVOFAKTORLEFT 左懸臂垂直位置&#xff0c;SERVOFAK…

js性能優化--學習筆記

《高性能網站建設進階指南》&#xff1a; 1.使用局部變量&#xff0c;避免深入作用域查找&#xff0c;局部變量是讀寫速度最快的&#xff1b;把函數中使用次數超過一次的對象屬性和數組存儲為局部變量是一個好方法&#xff1b;比如for循環中的.length通常可以保存為局部變量。 …

struct和typedef struct在C與C++中用法

struct和typedef struct 分三塊來講述&#xff1a;   1 首先&#xff1a;//注意在C和C里不同     在C中定義一個結構體類型要用typedef:     typedef struct Student    {    int a;    }Stu;     于是在聲明變量的時候就可&#xff1a;Stu stu1;(如…

【數據庫學習】——Python實現mysql數據庫SQL文件生成和導入

目錄 1、將mysql數據導出到SQL文件中&#xff08;數據庫存在的情況&#xff09; 2、將現有的sql文件數據導入到數據庫中&#xff08;前提數據庫存在&#xff09; 3、利用Navicat導出SQL文件和導入SQL文件 1&#xff09;從數據庫導出SQL文件 2&#xff09;導入SQL文件到數據…

lfcp——PB使用

場景&#xff1a;記錄以備忘。 1 直接說明 pb連接說明&#xff1a;目前項目共有性能、功能、業務、聯調四個環境。所以pb可以連接四個不同的數據庫。1.copy一份pb程序&#xff0c;修改main.ini文件中的DBCONNECT/DBCONNECT2位new&#xff0c;DBNAME/DBNAME2為oracle數據源中的源…

【重磅】Google官方推出了免費的、中文的、機器學習初級課程。

2019獨角獸企業重金招聘Python工程師標準>>> 機器學習(Machine Learning, ML)是一門多領域交叉學科&#xff0c;涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多門學科。它是人工智能的核心&#xff0c;是使計算機具有智能的根本途徑&#xff0c;其應用遍及…

市面上常見arduino版本比較

http://arduino.cc/en/Main/Products 詳細鏈接 如果是入門&#xff0c;那么首選UNO R3&#xff0c;方便又省心 如果不是特殊要求&#xff0c;不建議購買2560&#xff0c;因為貴啊 nano是塊很好的控制器&#xff0c;買不買隨你咯 非特殊場合使用不建…