sqlite基本使用

创建一个这样的数据库表:


image.png

1.创建sqlite数据库,用于创建数据库、表、属性的初始化、更新等操作。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 /**
  *这个类主要生成一 个数据库,并对数据库的版本进行管理
**/
public class MyOpenHelp extends SQLiteOpenHelper {
    public MyOpenHelp(Context context) {
        super(context, "xueji.db", null, 1);
    }
    /**
     * 当数据库第一次调用时
     * 特别适合做表结构的初始化
     * @param sqLiteDatabase
     */
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table IF NOT EXISTS xuesheng(_id integer primary key autoincrement,id varchar(20),name varchar(20),age int,sex Boolean)");
    }
 
    /**
     * 用于数据库更新, 可以执行修改表结构等语句
     */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        //添加列:添加一个名为 "Birthday" 的新列。
        sqLiteDatabase.execSQL("ALTER TABLE xuesheng ADD Birthday date");
        //删除列
        sqLiteDatabase.execSQL("ALTER TABLE xuesheng DROP COLUMN Birthday");
        //改变表中 "Birthday" 列的数据类型
        sqLiteDatabase.execSQL("ALTER TABLE Persons ALTER COLUMN Birthday year");
    }
}

2.activity中的使用

MyOpenHelp myOpenHelper=new MyOpenHelp(getApplicationContext());

添加:

SQLiteDatabase db=myOpenHelper.getWritableDatabase();
//第一种
ContentValues values=new ContentValues();
values.put("id",XH);
values.put("name",NM);
values.put("age",AG);
values.put("sex",SX);
long insert= db.insert("xuesheng",null,values);
if (insert>0){
      Toast.makeText(getApplicationContext(),"添加成功",Toast.LENGTH_SHORT).show();
}else {
      Toast.makeText(getApplicationContext(),"添加失败",Toast.LENGTH_SHORT).show();
}
//第二种
db.execSQL("insert into xuesheng(name,age) values('xiaoming','15')")

db.close();//数据库用完关闭

修改:

SQLiteDatabase db=myOpenHelper.getWritableDatabase();
//第一种
ContentValues values=new ContentValues();
values.put("name",name.getText().toString());
values.put("age",age.getText().toString());
values.put("sex",xingbie);
db.update("xuesheng",values,"id=?",new String[]{z_ID});
//第二种
String sql = "update xuesheng set name = "xiaohong" where id = 1";    
db.execSQL(sql);  

db.close();

查询:

SQLiteDatabase db=myOpenHelper.getReadableDatabase();
//第一种
Cursor cursor=db.rawQuery("select * from xuesheng where id=? and name=? and age=? and sex=?", new String[]{z_ID,z_NAME,z_AGE,z_SEX});
if (cursor!=null&&cursor.getCount()>0){
            while (cursor.moveToNext()){
                String id=cursor.getString(cursor.getColumnIndex("id"));
                String name=cursor.getString(cursor.getColumnIndex("name"));
                String Age=cursor.getString(cursor.getColumnIndex("age"));
                double age=Double.parseDouble(Age);
                String Sex=cursor.getString(cursor.getColumnIndex("sex"));
            }
} else 
    Show("查询0条结果");


db.close();

删除:

//第一种
SQLiteDatabase db=myOpenHelper.getWritableDatabase();
db.execSQL("delete from xuesheng where id=?",new Object[]{id});
//第二种
db.delete("xuesheng","id = ?",new Object[]{String.valueOf(id)});

db.close();

删除指定表

String sql ="DROP TABLE xuesheng";  
db.execSQL(sql); 

// 数据库版本的更新,由原来的1变为2

StuDBHelper dbHelper = new StuDBHelper(getApplicationContext(),"xueji_db",null,2);
SQLiteDatabase db =dbHelper.getReadableDatabase();

一个简单的对查询的封装:

package com.scott.db;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DBManager {
    private DBHelper helper;
    private SQLiteDatabase db;
    
    public DBManager(Context context) {
        helper = new DBHelper(context);
        //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);
        //所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
        db = helper.getWritableDatabase();
    }
    
    /**
     * add persons
     * @param persons
     */
    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();    //结束事务
        }
    }
    
    /**
     * update person's age
     * @param person
     */
    public void updateAge(Person person) {
        ContentValues cv = new ContentValues();
        cv.put("age", person.age);
        db.update("person", cv, "name = ?", new String[]{person.name});
    }
    
    /**
     * delete old person
     * @param person
     */
    public void deleteOldPerson(Person person) {
        db.delete("person", "age >= ?", new String[]{String.valueOf(person.age)});
    }

    public <T> List<T> getCommonListEntity(Class<T> clazz, String sql, String[] contentvalue) {
        List<Map<String, String>> maplist = getCommonListMap(sql, contentvalue);
        List<T> entitylist = new ArrayList<>();
        try {
            for (int i = 0; i < maplist.size(); i++) {
                Map<String, String> kvs = maplist.get(i);
                T t = clazz.newInstance();
                Field[] fields = clazz.getDeclaredFields();
                for (Field item : fields) {
                    item.setAccessible(true);  //在用反射时访问私有变量
                    if (kvs.get(item.getName()) != null) {
                        t = setItemValues(t, item, kvs.get(item.getName()));
                    }
                }
                entitylist.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return entitylist;
    }

    public List<Map<String, String>> getCommonListMap(String sql, String[] contentvalue) {
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        Cursor cursor = db.rawQuery(sql, contentvalue);
        while (cursor.moveToNext()) {
            Map<String, String> contents = new HashMap<String, String>();
            String[] keys = cursor.getColumnNames();
            for (int i = 0; i < keys.length; i++) {
                contents.put(keys[i], cursor.getString(cursor.getColumnIndex(keys[i])));
            }
            list.add(contents);
        }
        cursor.close();
        return list;
    }

    private <T> T setItemValues(T t, Field item, String value) {
        try {
            if (value == null) return t;

            if (item.getGenericType().toString().contains("String")) {//对String类型的判断
                item.set(t, value);
            }
            if (item.getGenericType().toString().contains("int")) {//对int类型的判断
                item.set(t, Integer.parseInt(value));
            }
            if (item.getGenericType().toString().contains("Integer")) {//对int类型的判断
                item.set(t, new Integer(value));
            }
            if (item.getGenericType().toString().contains("long")) {//对long类型的判断
                if (value.equals("")) {
                    item.set(t, 0l);
                } else {
                    item.set(t, Long.valueOf(value));
                }
            }
            if (item.getGenericType().toString().contains("float")) {//对float类型的判断
                item.set(t, Float.valueOf(value));
            }
            if (item.getGenericType().toString().contains("Date")) {//对date类型的判断
                if (value.equals("0") || value.equals("")) {
                    item.set(t, null);
                } else {
                    item.set(t, new Date(Long.valueOf(value)));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }
    
    /**
     * query all persons, return list
     * @return List<Person>
     */
    public List<Person> query() {
        ArrayList<Person> persons = new ArrayList<Person>();
        Cursor c = queryTheCursor();
        while (c.moveToNext()) {
            Person person = new Person();
            person._id = c.getInt(c.getColumnIndex("_id"));
            person.name = c.getString(c.getColumnIndex("name"));
            person.age = c.getInt(c.getColumnIndex("age"));
            person.info = c.getString(c.getColumnIndex("info"));
            persons.add(person);
        }
        c.close();
        return persons;
    }
    
    /**
     * query all persons, return cursor
     * @return    Cursor
     */
    public Cursor queryTheCursor() {
        Cursor c = db.rawQuery("SELECT * FROM person", null);
        return c;
    }
    
    /**
     * close database
     */
    public void closeDB() {
        db.close();
    }
}

//activity中的使用

例子:
List<FifteenParasModel> equalFistDate = DBManager.getCommonListEntity(FifteenParasModel.class, sql, new String[]{});

SQL语句中一些关键字的用法:
1.进行数据类型转换
cast(pl.PARAM_CONTENT as int)
2.合并
UNION ALL:去重
3.以。。。归类
group by
4.以。。。排序
order by(asc, desc)
eg:ORDER BY di.DISEASE_TYPE, ci.CATTLE_NO DESC

表A记录如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115

表B记录如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408
5.内联
INNER JOIN
eg:
select * from A
inner join B
on A.aID = B.bID
结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
说明inner join并不以谁为基础,它只显示符合条件的记录.
6.左联/右联
LEFT JOIN / RIGHT JOIN
eg:
(1).left join
select * from A
left join B
on A.aID = B.bID
结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL
这时候left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录
(2).right join
同上

7.限制条数
LIMIT
8.判断是否为空
IFNULL(st.name,'') //在string中写 空 ----- ''

一. 主键: (primary key)
一张表中只能有一个主键,它用于索引。
主键不要更新
eg:create table 表名称 (列名称1 数据类型 primary key, 列名称2 数据 类型,列名称3 数据类型, ...);
二. SQLite 约束:
约束是在表的数据列上强制执行的规则,这些是用来限制可以插入到表中的数据类型。
NOT NULL 约束:确保某列不能有NULL值
eg:CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
DEFAULT 约束:当某列没有指定值时,为该列提供默认值
eg: 不能有俩个相同年龄的纪录
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL DEFAULT 50000.00
);
UNIQUE 约束; 确保某列中的所有值是不同的
eg: CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR(50),
SALARY REAL DEFAULT 50000.00
);
CHECK 约束:确保某列中的所有数据满足一定条件
eg: 所有工资不能为0
CREATE TABLE COMPANY3(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL CHECK(SALARY > 0)
);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,914评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,709评论 2 59
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,916评论 2 89
  • 眼睛一睁开,看见五妈给发了个公务员岗位表截图。是的,拼命的日子又要来了,不是证明什么,只是想还自己一个无悔的青春!
    楠楠wyn阅读 158评论 0 0
  • 为什么平时他们不好好学习,临近考试买了答案轻轻松松就拿到了等级证书,而我们还要早起晨读,晚睡巩固学习才能勉强获得?...
    ICE蝈蝈阅读 592评论 2 2