加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite数据库

发布时间:2020-12-12 23:44:45 所属栏目:百科 来源:网络整理
导读:目录 SQLiteDatabase简介 创建数据库和表 使用SQL语句操作SQLite数据库 使用sqlite3工具 使用特定方法操作SQLite数据库 事务 SQLiteOpenHelper类 英文生词本 一 对SQLite数据库的理解 它是android系统集成的一个轻量级的数据库 是一个嵌入式的数据库引擎??

目录

  • SQLiteDatabase简介
  • 创建数据库和表
  • 使用SQL语句操作SQLite数据库
  • 使用sqlite3工具
  • 使用特定方法操作SQLite数据库
  • 事务
  • SQLiteOpenHelper类
  • 英文生词本

一 对SQLite数据库的理解

  • 它是android系统集成的一个轻量级的数据库
  • 是一个嵌入式的数据库引擎??
  • 适用于资源有限的设备上适量数据的存取
  • 它只是一个文件
  • SQLite的操作方式只是一种更为便捷的文件操作
  • 当应用程序创建或打开一个SQLite数据库时,其实只是打开一个文件准备读写

二 SQLiteDatabase的理解

  • android提供SQLiteDatabase代表一个数据库(底层是一个数据库文件)
  • 通过SQLiteDatabase对象来管理操作数据库
  • SQLiteDatabase提供了如下静态方法来打开一个文件对应的数据库
//1 打开path文件所代表的SQLite数据库
static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags)
//2 打开或创建(如果不存在)file文件所代表的SQLite数据库
static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory)
//3 打开或创建(如果不存在)path文件所代表的SQLite数据库
static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)
  • 在程序中获取SQLiteDatabase对象之后,就可以调用以下的方法来操作数据库了
//1 执行带占位符的sql语句
execSQL(String sql,Object[] bindArgs)
//2 执行sql语句
execSQL(String sql)
//3 向指定的表中插入数据
insert(String table,String nullColumnHack,ContentValues values)
//4 更新指定表中的特定数据
update(String table,ContentValues values,String whereClause,String[] whereArgs)
//5 删除指定表中的特定数据
delete(String table,String[] whereArgs)
//6.1 对指定数据表进行查询
Cursor query(String table,String[] columns,String[] whereArgs,String groupBy,String having,String OrderBy)
//6.2 limit控制最多查询几条记录
Cursor query(String table,String OrderBy,String limit)
//6.3 第一个参数控制是否去除重复值
Cursor query(boolean distinct,String table,String limit)
//7 执行带占位符的sql查询
rawQuery(String sql,String[] selectionArgs)
//8 开始事务
beginTransaction()
//9 结束事务
endTransaction()

三 Cursor的理解

  • Cursor提供以下的方法来移动查询结果的记录指针
//1 将记录指针向上或向下移动指定的行数,offset为正是向下移动,为负是向上移动
move(int offset) 
//2 将记录指针移动到第一行,如果成功就返回true
boolean moveToFirst()
//3 将记录指针移动到最后一行,如果成功就返回true
boolean moveToLast()
//4 将记录指针移动到下一行,如果成功就返回true
boolean moveToNext()
//5 将记录指针移动到指定行,成功就返回true
boolean moveToPosition()
//6 将记录指针移动到上一行,成功返回true
boolean moveToPrevious()
  • 一旦记录指针移动到指定行后,就可以调用Cursor的getXxx()方法获取该行的指定列的数据了

四 创建数据库和表

  • 创建数据库
    前面已经说过了,使用SQLiteDatabase的静态方法就可以打开或创建数据库,ex:
//如果有temp.db3就打开,没有就创建,这里没有指定SQLieDatabase.CursorFactory参数,该参数是一个用于返回Cursor的工厂,如果是null,就表示用默认的工厂,这行代码就可以返回一个SQLiteDatabase对象
SQLiteDatabase.openOrCreateDatabase("/mnt/db/temp.db3",null)
  • 创建数据表
    创建过SQLiteDatabase对象之后,该对象的execSQL()方法可以执行任意的sql语句,自然可以创建表
//定义创建表的语句
sql = "create table user_inf(user_id integer primary key,user_name varchar(255),user_pass varchar(255))" //执行sql语句,db就是SQLiteDatabase db.execSQL(sql);

五 使用SQL语句操作SQLite数据库

  • SQLiteDatabase的execSQL()方法可以执行任意的SQL语句,包括带占位符的,但是该方法没有返回值,如果使用查询语句,可以调用rawQuery(String sql,String[] selectionArgs) 方法
    ex:执行插入语句
db.insert("insert table tb_info values(null,?,?)",String[]{title,content});
  • 以下程序示范如何在Android应用中操作数据库
package com.example.sqlshj;

import android.app.Activity;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends Activity {
    private SQLiteDatabase db;
    private EditText title,content;
    private String s_title,s_content;
    private Button insert;
    private ListView lv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 创建数据库
        db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + "/temp.db3",null);
        initComponent();
        setListener();
    }

    private void initData() {
        s_title = title.getText().toString();
        s_content = content.getText().toString();
    }

    private void setListener() {
        insert.setOnClickListener(btListener);
    }

    private void initComponent() {
        title = (EditText) findViewById(R.id.et_title);
        content = (EditText) findViewById(R.id.et_content);
        insert = (Button) findViewById(R.id.bt_insert);
        lv = (ListView) findViewById(R.id.lv);
    }

    private OnClickListener btListener = new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            initData();
            // 点击就插入数据到数据库,并查询数据库,将数据显示在listview中
            try {
                insertData(db,s_title,s_content);
                Cursor cursor = db.rawQuery("select * from shj",null);
                inflateList(cursor);
            } catch (SQLException e) {
                //创建表,表的主键列的列名必须是_id,因为SimpleCursorAdapter只能识别_id的主键
                db.execSQL("create table shj (_id integer primary key autoincrement,table_title varchar(50),table_content varchar(255))");
                insertData(db,null);
                inflateList(cursor);
            }
        }

        private void inflateList(Cursor cursor) {
            lv.setAdapter(new SimpleCursorAdapter(MainActivity.this,R.layout.lv_item,cursor,new String[] { "table_title","table_content" },new int[] { R.id.tv_title,R.id.tv_content }));
        }

        private void insertData(SQLiteDatabase db,String s_title,String s_content) {
            db.execSQL("insert into shj values(null,new String[] {
                    s_title,s_content });
        }
    };
//记得要关闭db,否则会资源泄露
    protected void onDestroy() {
        super.onDestroy();
        if (db != null && db.isOpen()) {
            db.close();
        }
    };
}

总结使用SQLiteDatabase操作数据库的步骤如下

  • 获取SQListDatabase对象,他代表与数据库的连接
  • 调用SQLiteDatabase的方法来执行SQL语句
  • 操作SQL语句的执行结果,如用SimpleCursorAdapter来封装Cursor
  • 关闭SQLiteDatabase,回收资源

六 SQLiteOpenHelper

  • 对SQLiteOpenHelper类的理解
    在上一个程序中,我们为了判断底层数据库是否包含shj数据表,采用以下方法:
try {
                insertData(db,s_content);
                Cursor cursor = db.rawQuery("select * from shj",null); inflateList(cursor); } catch (SQLException e) { //创建表,表的主键列的列名必须是_id,因为SimpleCursorAdapter只能识别_id的主键 db.execSQL("create table shj (_id integer primary key autoincrement,table_title varchar(50),table_content varchar(255))"); insertData(db,s_content); Cursor cursor = db.rawQuery("select * from shj",null); inflateList(cursor); }

程序先尝试向shj中插入数据,如果异常,在异常捕获的catch块中创建shj数据表,然后在插入记录。———–SQLiteOpenHelper可以处理这个问题
SQLiteOpenHelper是Android提供的用于管理数据库的工具类,管理数据库的创建与版本更新
SQLiteOpenHelper的用法:创建子类继承SQLiteOpenHelper,再重写onCreate(),onUpgrade()方法

  • SQLiteOpenHelper的常用方法
//1 以读写的方式打开数据库对应的SQLiteDatabase对象
  - synchronized SQLiteDatabase getReadableDatabase():
  //2 以写的方式打开数据库对应的SQLiteDatabase对象
  - synchronized SQLiteDatabase getWritableDatabase():
  //3 当第一次创建数据库时回调
  - abstract void onCreate(SQLiteDatabase db):
  //4 当数据库版本更新是回调该方法
  - abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):
  //关闭所有打开的SQLiteDatabase对象
  - synchronized void close()
  //构造方法?
  super(Context context,String db_name,null,int version)

方法分析:

  • 打开数据库连接:getReadableDatabase(),getWritabaleDatabase()
  • 关闭数据库连接:close()
  • 开发者要做的就是重新两个抽象方法onCreate(),onUpgrade()
  • onCreate(SQLiteDatabase db):用于初次使用时生成数据库表。当调用SQLiteOpenHelper的getWritableDatabase(),或者getReadableDatabase()方法获取操作数据库的SQLiteDatabase实例时,如果数据库不存在,Android会自动生成一个数据库,接着会调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用。重写onCreate()方法时,可以生成数据表结构,以添加应用使用到的一些初始化数据。
  • onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):升级软件时更新数据库的表结构。在创建SQLiteOpenHelper对象时,必须指定一个version参数,这个参数就是版本号。提示:当应用程序升级表结构时,可能因为已有的数据导致升级失败,解决方案:先对数据进行转储,清空数据表中的记录,接着更新数据表,在将数据保存回来。
  • 两个打开数据库方法的比较:
    • getWritableDatabase():以写的方式打开数据库,当数据库磁盘满了,数据库就只能读,不能写,这时候,使用它打开数据库就会出错
    • getReadabaleDatabase():以读写的方式打开数据库,但磁盘满了,就会打开失败,但是会尝试用只读的方式打开数据库。

疑问

  • 什么是SQLiteDatabase? 数据库
  • 怎样创建数据库和表
  • sql语句的使用
  • sqlite3工具如何使用
  • 什么是事务
  • SQLiteOpenHelper类的作用
  • 什么事jdbc编程

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读