zoukankan      html  css  js  c++  java
  • SQLite数据库的基本操作

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

    下面简单介绍其在安卓中的应用:

    1.首先自己写一个类MyOpenHelper继承SQLiteOpenHelper,SQLiteOpenHelper是抽象类,需要重写构造方法和实现两个方法。如下:

    package com.example.sqlite;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class MyOpenHelper extends SQLiteOpenHelper {
    
        /**
         * 重写构造方法,因为父类没有无参构造方法
         * @param context
         * @param name
         * @param factory
         * @param version
         */
        public MyOpenHelper(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, factory, version);
        }
    
        /**
         * 数据库创建时,此方法会调用
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
            System.out.println("数据库被创建了");
            db.execSQL("create table person(_id integer primary key autoincrement," +
                    " name varchar(10), salary varchar(20), phone integer(20))");
        }
    
        /**
         * 数据库升级时,此方法被调用
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            System.out.println("数据库升级了");
        }
    
    }

    2.在测试类中进行测试,增删改查,下面演示第一种,自己写SQL语句:

    package com.example.sqlite.test;
    
    import com.example.sqlite.MyOpenHelper;
    
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.test.AndroidTestCase;
    
    public class TestCase extends AndroidTestCase {
        
        private MyOpenHelper oh;
        private SQLiteDatabase db;
        
        /**
         * 测试创建数据库
         * 即使运行两遍,也只会创建一次数据库
         */
        public void test1(){
            MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
            //如果数据库不存在,先创建数据库,再获取可读可写的数据库对象,如果数据库存在,就直接打开
            SQLiteDatabase db = oh.getWritableDatabase();
            //返回的和上面的没区别,除非内部存储空间满了,返回只读数据库
            //SQLiteDatabase db = oh.getReadableDatabase();
        }
    
        /**
         * 测试框架初始完毕之后,在测试方法执行之前,此方法调用
         */
        @Override
        protected void setUp() throws Exception {
            super.setUp();
            oh = new MyOpenHelper(getContext(), "people.db", null, 1);
            db = oh.getWritableDatabase();
        }
        /**
         * 测试方法执行之后,此方法调用
         */
        @Override
        protected void tearDown() throws Exception {
            super.tearDown();
            db.close();
        }
        
        
        /**
         * 测试插入
         */
        public void test2(){
            db.execSQL("insert into person(name, salary, phone) values(?,?,?)", 
                    new Object[]{"陈驰","15000",151762});
        }
        
        /**
         * 测试删除
         */
        public void test3(){
            db.execSQL("delete from person where name=?", new Object[]{"陈驰"});
        }
        
        /**
         * 测试更新
         */
        public void test4(){
            db.execSQL("update person set phone=? where name=?",new Object[]{123456, "陈驰"});
        }
        
        /**
         * 测试查询
         */
        public void test5(){
            //注意,API变了,第二个参数是sql语句中?的填充
            Cursor cursor = db.rawQuery("select name, salary from person", null);
            while(cursor.moveToNext()){
                //通过列索引获取列的值
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String salary = cursor.getString(cursor.getColumnIndex("salary"));
                System.out.println(name+",,,"+salary);
            }
        }
        
    }

    3.在测试类中进行测试,增删改查,下面演示第二种,调用API:

    public void insertApi(){
            //把要插入的数据全部封装至ContentValues对象
            ContentValues values = new ContentValues();
            values.put("name", "陈掣");
            values.put("salary", "16000");
            values.put("phone", 15176290645L);
            //返回的是最新插入的主键值(表名,填写null就行<只有在values为空才有用>,插入的内容)
            long id = db.insert("person", null, values);
            System.out.println(id);
        }
        
        public void deleteApi(){
            //返回的是删除的行数(表名,条件,条件中?的填充)
            int rows = db.delete("person", "name=? and _id=?", new String[]{"陈驰", "10"});
            System.out.println(rows);
        }
        
        public void updateApi(){
            ContentValues values = new ContentValues();
            values.put("salary", "777777");
            //返回的是受影响的行数(表名,更改的内容,条件,条件中?的填充)
            int rows = db.update("person", values, "_id=?", new String[]{"7"});
            System.out.println(rows);
        }
        
        public void selectApi(){
            //(表名,查询字段<null为所有字段>,查询条件,查询条件中?的填充,groupby,having,orderby,limit)
            Cursor cursor = db.query("person", null, "name=?", new String[]{"陈掣"}, 
                    null, null, null, null);
            while(cursor.moveToNext()){
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String salary = cursor.getString(cursor.getColumnIndex("salary"));
                String phone = cursor.getString(cursor.getColumnIndex("phone"));
                System.out.println(name+","+salary+","+phone);
            }
        }

    以上就是简单的增删改查操作,可以下载一个SQLite Expert可视化工具进行查看。

    4.事务管理,模拟一个转账的例子

    public void transaction(){
            try {
                //开启事务
                db.beginTransaction();
                
                ContentValues values = new ContentValues();
                values.put("salary", "19000");
                db.update("person", values, "_id=?", new String[]{"11"});
                
                values.clear();
                values.put("salary", "13000");
                db.update("person", values, "_id=?", new String[]{"12"});
                
                //int i = 2/0;  //如果在这里抛异常,则设置事务执行成功的代码不会执行,sql语句回滚,update不生效
                //设置事务执行成功
                db.setTransactionSuccessful();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭事务,同时提交,如果已经设置事务执行成功,那么sql语句就生效了,反之,sql语句回滚
                db.endTransaction();
            }
        }
  • 相关阅读:
    SQL字符串操作汇总
    重构之道清除代码异味
    Html.Action和Html.RederAction来创建子视图
    C#实现Thrift连接池[新]
    CentOS下配置Apache反向代理出错的解决
    entity framework实体用数据库默认值的方法
    为IEnumerable类型添加Add方法
    一个对Entity Framework数据层的封装
    将.netFramework4.5/MVC4/EF5/Oracle网站发布到Server2008/iis7的痛苦经历
    让vs2012运行vs2010插件的方法
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/5454645.html
Copyright © 2011-2022 走看看