美文网首页
sqlite基本使用

sqlite基本使用

作者: 龙龙zzl | 来源:发表于2018-11-30 17:05 被阅读0次

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


    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)
    );

    相关文章

      网友评论

          本文标题:sqlite基本使用

          本文链接:https://www.haomeiwen.com/subject/xqlhcqtx.html