详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
http://blog.csdn.net/xiaominghimi/archive/2011/01/04/6114629.aspx 作者:Himi 先介绍几个基本概念知识: 什么是SQLite: SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,只需要几百KB!!!!! SQLite的特性:
http://blog.csdn.net/xiaominghimi/archive/2011/01/04/6114629.aspx
作者:Himi
先介绍几个基本概念知识:
什么是SQLite:
SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,只需要几百KB!!!!!
SQLite的特性:
- 轻量级
使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。 - 独立性
SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。 - 隔离性
SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。 - 跨平台
SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。 - 多语言接口
SQLite 数据库支持多语言编程接口。 - 安全性
SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据.
优点:1.能存储较多的数据。
2.能将数据库文件存放到SD卡中!
什么是 SQLiteDatabase?
一个 SQLiteDatabase 的实例代表了一个SQLite 的数据库,通过SQLiteDatabase 实例的一些方法,我们可以执行SQL 语句,对数 据库进行增、删、查、改的操作。需要注意的是,数据库对于一个应用来说是私有的,并且在一个应用当中,数据库的名字也是惟一的。
什么是 SQLiteOpenHelper ?
根据这名字,我们可以看出这个类是一个辅助类。这个类主要生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的 方法getWritableDatabase(),或者getReadableDatabase()方法的时候,如果当时没有数据,那么Android 系统就会自动生成一 个数 据库。SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里边的3 个函数,
什么是 ContentValues 类?
ContentValues 类和Hashmap/Hashtable 比较类似,它也是负责存储一些名值对,但是它存储的名值对当中的名是一个
String 类型,而值都是基本类型。
什么是 Cursor ?
Cursor 在Android 当中是一个非常有用的接口,通过Cursor 我们可以对从数据库查询出来的结果集进行随 机的读写访问。
OK,基本知识就介绍到这里,下面开始上代码:还是按照我的一贯风格,代码中该解释的地方都已经在代码中及时注释和讲解了!
顺便来张项目截图:
先给出xml:
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- xml version="1.0" encoding="utf-8"?>
- LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- TextView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="SQL 练习!(如果你使用的SD卡存储数据方式,为了保证正常操作,请你先点击创建一张表然后再操作)"
- android:textSize="20sp" android:textColor="#ff0000" android:id="@+id/tv_title" />
- Button android:id="@+id/sql_addOne" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="插入一条记录">Button>
- Button android:id="@+id/sql_check" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="查询数据库">Button>
- Button android:id="@+id/sql_edit" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="修改一条记录">Button>
- Button android:id="@+id/sql_deleteOne" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="删除一条记录">Button>
- Button android:id="@+id/sql_deleteTable" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="删除数据表单">Button>
- Button android:id="@+id/sql_newTable" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="新建数据表单">Button>
- LinearLayout>
xml中定义了我们需要练习用到的几个操作按钮,这里不多解释了,下面看java源码:先看我们继承的 SQLiteOpenHelper 类
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- package com.himi;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- import android.util.Log;
- /**
- *
- * @author Himi
- * @解释 此类我们只需要传建一个构造函数 以及重写两个方法就OK啦、
- *
- */
- public class MySQLiteOpenHelper extends SQLiteOpenHelper {
- public final static int VERSION = 1;// 版本号
- public final static String TABLE_NAME = "himi";// 表名
- public final static String ID = "id";// 后面ContentProvider使用
- public final static String TEXT = "text";
- public static final String DATABASE_NAME = "Himi.db";
- public MySQLiteOpenHelper(Context context) {
- // 在Android 中创建和打开一个数据库都可以使用openOrCreateDatabase 方法来实现,
- // 因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;
- // 创建成功则返回一个 SQLiteDatabase对象,否则抛出异常FileNotFoundException。
- // 下面是来创建一个名为"DATABASE_NAME"的数据库,并返回一个SQLiteDatabase对象
- super(context, DATABASE_NAME, null, VERSION);
- }
- @Override
- // 在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表;
- public void onCreate(SQLiteDatabase db) {
- String str_sql = "CREATE TABLE " + TABLE_NAME + "(" + ID
- + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";
- // CREATE TABLE 创建一张表 然后后面是我们的表名
- // 然后表的列,第一个是id 方便操作数据,int类型
- // PRIMARY KEY 是指主键 这是一个int型,用于唯一的标识一行;
- // AUTOINCREMENT 表示数据库会为每条记录的key加一,确保记录的唯一性;
- // 最后我加入一列文本 String类型
- // ----------注意:这里str_sql是sql语句,类似dos命令,要注意空格!
- db.execSQL(str_sql);
- // execSQL()方法是执行一句sql语句
- // 虽然此句我们生成了一张数据库表和包含该表的sql.himi文件,
- // 但是要注意 不是方法是创建,是传入的一句str_sql这句sql语句表示创建!!
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // 一般默认情况下,当我们插入 数据库就立即更新
- // 当数据库需要升级的时候,Android 系统会主动的调用这个方法。
- // 一般我们在这个方法里边删除数据表,并建立新的数据表,
- // 当然是否还需要做其他的操作,完全取决于游戏需求。
- Log.v("Himi", "onUpgrade");
- }
- }
我喜欢代码中立即附上解释,感觉这样代码比较让大家更容易理解和寻找,当然如果童鞋们不喜欢,可以告诉我,我改~嘿嘿~
下面看最重要的MainActivity中的代码:
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- package com.himi;
- import java.io.File;
- import java.io.IOException;
- import android.app.Activity;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.os.Bundle;
- import android.view.View;
- import android.view.Window;
- import android.view.WindowManager;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- // ------------第三种保存方式--------《SQLite》---------
- /**
- * @author Himi
- * @保存方式:SQLite 轻量级数据库、
- * @优点: 可以将自己的数据存储到文件系统或者数据库当中, 也可以将自己的数据存
- * 储到SQLite数据库当中,还可以存到SD卡中
- * @注意1:数据库对于一个游戏(一个应用)来说是私有的,并且在一个游戏当中,
- * 数据库的名字也是唯一的。
- * @注意2 apk中创建的数据库外部的进程是没有权限去读/写的,
- * 我们需要把数据库文件创建到sdcard上可以解决类似问题.
- * @注意3 当你删除id靠前的数据或者全部删除数据的时候,SQLite不会自动排序,
- * 也就是说再添加数据的时候你不指定id那么SQLite默认还是在原有id最后添加一条新数据
- * @注意4 android 中 的SQLite 语法大小写不敏感,也就是说不区分大小写;
- *
- */
- public class MainActivity extends Activity implements OnClickListener {
- private Button btn_addOne, btn_deleteone, btn_check, btn_deleteTable,
- btn_edit, btn_newTable;
- private TextView tv;
- private MySQLiteOpenHelper myOpenHelper;// 创建一个继承SQLiteOpenHelper类实例
- private SQLiteDatabase mysql ;
- //---------------以下两个成员变量是针对在SD卡中存储数据库文件使用
- // private File path = new File("/sdcard/himi");// 创建目录
- // private File f = new File("/sdcard/himi/himi.db");// 创建文件
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- tv = (TextView) findViewById(R.id.tv_title);
- btn_addOne = (Button) findViewById(R.id.sql_addOne);
- btn_check = (Button) findViewById(R.id.sql_check);
- btn_deleteone = (Button) findViewById(R.id.sql_deleteOne);
- btn_deleteTable = (Button) findViewById(R.id.sql_deleteTable);
- btn_newTable = (Button) findViewById(R.id.sql_newTable);
- btn_edit = (Button) findViewById(R.id.sql_edit);
- btn_edit.setOnClickListener(this);
- btn_addOne.setOnClickListener(this);
- btn_check.setOnClickListener(this);
- btn_deleteone.setOnClickListener(this);
- btn_deleteTable.setOnClickListener(this);
- btn_newTable.setOnClickListener(this);
- myOpenHelper = new MySQLiteOpenHelper(this);// 实例一个数据库辅助器
- //备注1 ----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:
- // if (!path.exists()) {// 目录存在返回false
- // path.mkdirs();// 创建一个目录
- // }
- // if (!f.exists()) {// 文件存在返回false
- // try {
- // f.createNewFile();//创建文件
- // } catch (IOException e) {
- // // TODO Auto-generated catch block
- // e.printStackTrace();
- // }
- // }
- }
- @Override
- public void onClick(View v) {
- try {
- //备注2----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:
- // mysql = SQLiteDatabase.openOrCreateDatabase(f, null);
- //备注3--- 如果想把数据库文件默认放在系统中,那么创建数据库mysql如下操作:
- mysql = myOpenHelper.getWritableDatabase(); // 实例数据库
- if (v == btn_addOne) {// 添加数据
- // ---------------------- 读写句柄来插入---------
- // ContentValues 其实就是一个哈希表HashMap, key值是字段名称,
- //Value值是字段的值。然后 通过 ContentValues 的 put 方法就可以
- //把数据放到ContentValues中,然后插入到表中去!
- ContentValues cv = new ContentValues();
- cv.put(MySQLiteOpenHelper.TEXT, "测试新的数据");
- mysql.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
- // inser() 第一个参数 标识需要插入操作的表名
- // 第二个参数 :默认传null即可
- // 第三个是插入的数据
- // ---------------------- SQL语句插入--------------
- // String INSERT_DATA =
- // "INSERT INTO himi (id,text) values (1, '通过SQL语句插入')";
- // db.execSQL(INSERT_DATA);
- tv.setText("添加数据成功!点击查看数据库查询");
- } else if (v == btn_deleteone) {// 删除数据
- // ---------------------- 读写句柄来删除
- mysql.delete("himi", MySQLiteOpenHelper.ID + "=1", null);
- // 第一个参数 需要操作的表名
- // 第二个参数为 id+操作的下标 如果这里我们传入null,表示全部删除
- // 第三个参数默认传null即可
- // ----------------------- SQL语句来删除
- // String DELETE_DATA = "DELETE FROM himi WHERE id=1";
- // db.execSQL(DELETE_DATA);
- tv.setText("删除数据成功!点击查看数据库查询");
- } else if (v == btn_check) {// 遍历数据
- //备注4------
- Cursor cur = mysql.rawQuery("SELECT * FROM "
- + MySQLiteOpenHelper.TABLE_NAME, null);
- if (cur != null) {
- String temp = "";
- int i = 0;
- while (cur.moveToNext()) {//直到返回false说明表中到了数据末尾
- temp += cur.getString(0);
- // 参数0 指的是列的下标,这里的0指的是id列
- temp += cur.getString(1);
- // 这里的0相对于当前应该是咱们的text列了
- i++;
- temp += " "; // 这里是我整理显示格式 ,呵呵~
- if (i % 3 == 0) // 这里是我整理显示格式 ,呵呵~
- temp += "/n";// 这里是我整理显示格式 ,呵呵~
- }
- tv.setText(temp);
- }
- } else if (v == btn_edit) {// 修改数据
- // ------------------------句柄方式来修改 -------------
- ContentValues cv = new ContentValues();
- cv.put(MySQLiteOpenHelper.TEXT, "修改后的数据");
- mysql.update("himi", cv, "id " + "=" + Integer.toString(3), null);
- // ------------------------SQL语句来修改 -------------
- // String UPDATA_DATA =
- // "UPDATE himi SET text='通过SQL语句来修改数据' WHERE id=1";
- // db.execSQL(UPDATA_DATA);
- tv.setText("修改数据成功!点击查看数据库查询");
- } else if (v == btn_deleteTable) {// 删除表
- mysql.execSQL("DROP TABLE himi");
- tv.setText("删除表成功!点击查看数据库查询");
- } else if (v == btn_newTable) {// 新建表
- String TABLE_NAME = "himi";
- String ID = "id";
- String TEXT = "text";
- String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
- + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT
- + " text );";
- mysql.execSQL(str_sql2);
- tv.setText("新建表成功!点击查看数据库查询");
- }
- // 删除数据库:
- // this.deleteDatabase("himi.db");
- } catch (Exception e) {
- tv.setText("操作失败!");
- } finally {// 如果try中异常,也要对数据库进行关闭
- mysql.close();
- }
- }
- }

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

Hibernate多態映射可映射繼承類別到資料庫,提供以下映射類型:joined-subclass:為子類別建立單獨表,包含父類別所有欄位。 table-per-class:為子類別建立單獨資料表,僅包含子類別特有列。 union-subclass:類似joined-subclass,但父類別表聯合所有子類別列。

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

透過Go標準庫database/sql包,可以連接到MySQL、PostgreSQL或SQLite等遠端資料庫:建立包含資料庫連接資訊的連接字串。使用sql.Open()函數開啟資料庫連線。執行SQL查詢和插入操作等資料庫操作。使用defer關閉資料庫連線以釋放資源。

在Golang中使用資料庫回呼函數可以實現:在指定資料庫操作完成後執行自訂程式碼。透過單獨的函數新增自訂行為,無需編寫額外程式碼。回調函數可用於插入、更新、刪除和查詢操作。必須使用sql.Exec、sql.QueryRow或sql.Query函數才能使用回呼函數。

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

在C++中使用DataAccessObjects(DAO)函式庫連接和操作資料庫,包括建立資料庫連線、執行SQL查詢、插入新記錄和更新現有記錄。具體步驟為:1.包含必要的函式庫語句;2.開啟資料庫檔案;3.建立Recordset物件執行SQL查詢或操作資料;4.遍歷結果或依照特定需求更新記錄。
