文档章节

Android之SQLite

思想永无止境
 思想永无止境
发布于 2016/11/04 11:59
字数 1109
阅读 4
收藏 0

SQLite支持大部分标准的SQL。
SQLite是无类型数据数据库(类似JavaScript),除主键外无数据类型也无数据长度(主键只能为int),不过建议在声明字段时最好写上数据类型和长度,符合SQL规范才能通用。
SQL分页语句和MySQL一样:select * from tableName limit pageSize offset beginIndex或select * from tableName limit beginIndex,pageSize。
获取表中最后一行数据的id:select last_insert_rowid()。

android中使用SQLite不需要使用JDBC创建连接,SQLiteDatabase类内部会自己创建。

Android中创建SQLite数据库:

public class DBOpenHelper extends SQLiteOpenHelper {

    public static SQLiteDatabase createDB(Context context) {
        DBOpenHelper openHelper = new DBOpenHelper(context);
        return openHelper.getWritableDatabase();// 第一次调用此方法或getReadableDatabase方法会创建数据库
    }

    public DBOpenHelper(Context context) {
        // 数据库文件保存在'/data/data/appName/appPackageName/databases/'目录中
        super(context, "test.db",// 数据库文件名
                null,// 是用默认游标工厂
                1// 版本号不能小于1,小于1会抛异常,一般初始版本从1开始
        );
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 数据库创建时被触发,此方法内一般用于创建表等
        db.execSQL("create table person(person_id integer primary key autoincrement,name verchar(20),age integer)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库版本号更新时被触发,此方法一般操作数据库版本升级,如删除旧表,创建新表,修改表等
        db.execSQL("alter table person add sex verchar(2)");
    }
}

数据库大小有限制,openHelper.getWritableDatabase方法在大小达到最大时会报错,只能调用openHelper.getReadableDatabase。
openHelper.getReadableDatabase在数据库大小没有达到上限时方法内部调用openHelper.getWritableDatabase。

增删改查代码:

public class PersonService {

    private static String SimpleClassName = PersonService.class.getSimpleName();

    private DBOpenHelper helper;

    public PersonService(DBOpenHelper helper) {
        this.helper = helper;
    }

    public void add(Person person) {

        SQLiteDatabase database = helper.getWritableDatabase();
        database.beginTransaction();
        try {
            Object[] parameter = { person.getName(), person.getAge(), person.getSex() };
            database.execSQL("insert into person(name,age,sex) values(?,?,?)", parameter);

            database.setTransactionSuccessful();// 事物默认标志是回滚,这里需要改变标识为true提交
        } catch (Exception e) {
            Log.e(SimpleClassName + " add", e.getMessage());
        } finally {
            database.endTransaction();
        }
    }

    public void add2(Person person) {

        SQLiteDatabase database = helper.getWritableDatabase();
        database.beginTransaction();
        try {
            ContentValues values = new ContentValues(3);
            values.put("name", person.getName());
            values.put("age", person.getAge());
            values.put("sex", person.getSex());
            helper.getWritableDatabase().insert("person", null, values);

            database.setTransactionSuccessful();// 事物默认标志是回滚,这里需要改变标识为true提交
        } catch (Exception e) {
            Log.e(SimpleClassName + " add2", e.getMessage());
        } finally {
            database.endTransaction();
        }
    }

    public void delete(Integer id) {

        helper.getWritableDatabase().beginTransaction();
        try {
            Object[] parameter = { id };
            helper.getWritableDatabase().execSQL("delete from person where person_id=?", parameter);

            helper.getWritableDatabase().setTransactionSuccessful();// 事物默认标志是回滚,这里需要改变标识为true提交
        } catch (Exception e) {
            Log.e(SimpleClassName + " delete", e.getMessage());
        } finally {
            helper.getWritableDatabase().endTransaction();
        }
    }

    public void delete2(Integer id) {

        SQLiteDatabase database = helper.getWritableDatabase();
        database.beginTransaction();
        try {
            String[] parameter = { id.toString() };
            database.delete("person", "person_id=?", parameter);

            database.setTransactionSuccessful();// 事物默认标志是回滚,这里需要改变标识为true提交
        } catch (Exception e) {
            Log.e(SimpleClassName + " delete2", e.getMessage());
        } finally {
            database.endTransaction();
        }
    }

    public void update(Person person) {

        SQLiteDatabase database = helper.getWritableDatabase();
        database.beginTransaction();
        try {
            Object[] parameter = { person.getName(), person.getAge(), person.getSex(), person.getPersonId() };
            database.execSQL("update person set name=?,age=?,sex=? where person_id=?", parameter);

            database.setTransactionSuccessful();// 事物默认标志是回滚,这里需要改变标识为true提交
        } catch (Exception e) {
            Log.e(SimpleClassName + " update", e.getMessage());
        } finally {
            database.endTransaction();
        }
    }

    public void update2(Person person) {

        helper.getWritableDatabase().beginTransaction();
        try {

            String[] parameter = { person.getPersonId().toString() };
            ContentValues values = new ContentValues(3);
            values.put("name", person.getName());
            values.put("age", person.getAge());
            values.put("sex", person.getSex());
            helper.getWritableDatabase().update("person", values, "person_id=?", parameter);

            helper.getWritableDatabase().setTransactionSuccessful();// 事物默认标志是回滚,这里需要改变标识为true提交
        } catch (Exception e) {
            Log.e(SimpleClassName + " update2", e.getMessage());
        } finally {
            helper.getWritableDatabase().endTransaction();
        }
    }

    public Person findById(Integer id) {
        String[] parameter = { id.toString() };
        try (Cursor cursor = helper.getReadableDatabase().rawQuery("select * from person where person_id=?", parameter)) {
            if (cursor.moveToFirst()) {// 如果没有数据会返回false
                Person person = new Person();
                person.setPersonId(cursor.getInt(cursor.getColumnIndex("person_id")));
                person.setName(cursor.getString(cursor.getColumnIndex("name")));
                person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
                person.setSex(cursor.getString(cursor.getColumnIndex("sex")));
                return person;
            }
        } catch (Exception e) {
            Log.e(SimpleClassName + " findById", e.getMessage());
        }
        return null;
    }

    public Person findById2(Integer id) {
        String[] parameter = { id.toString() };
        String[] columns = { "name", "age", "sex", "person_id" };
        try (Cursor cursor = helper.getReadableDatabase().query("person", columns, "person_id=?", parameter, null, null, null)) {
            if (cursor.moveToFirst()) {// 如果没有数据会返回false
                Person person = new Person();
                person.setPersonId(cursor.getInt(cursor.getColumnIndex("person_id")));
                person.setName(cursor.getString(cursor.getColumnIndex("name")));
                person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
                person.setSex(cursor.getString(cursor.getColumnIndex("sex")));
                return person;
            }
        } catch (Exception e) {
            Log.e(SimpleClassName + " findById2", e.getMessage());
        }
        return null;
    }

    public List<Person> findList(Integer beginIndex, Integer pageSize) {
        List<Person> persons = new LinkedList<>();
        String[] parameter = { beginIndex.toString(), pageSize.toString() };
        try (Cursor cursor = helper.getReadableDatabase().rawQuery("select * from person order by person_id asc limit ?,?", parameter)) {
            for (; cursor.moveToNext();) {// 如果没有数据会返回false
                Person person = new Person();
                person.setPersonId(cursor.getInt(cursor.getColumnIndex("person_id")));
                person.setName(cursor.getString(cursor.getColumnIndex("name")));
                person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
                person.setSex(cursor.getString(cursor.getColumnIndex("sex")));
                persons.add(person);
            }
        } catch (Exception e) {
            Log.e(SimpleClassName + " findList", e.getMessage());
        }
        return persons;
    }

    public List<Person> findList2(Integer beginIndex, Integer pageSize) {
        List<Person> persons = new LinkedList<>();
        try (Cursor cursor = helper.getReadableDatabase().query("person", null, null, null, null, null, "person_id asc", beginIndex + "," + pageSize)) {
            for (; cursor.moveToNext();) {// 如果没有数据会返回false
                Person person = new Person();
                person.setPersonId(cursor.getInt(cursor.getColumnIndex("person_id")));
                person.setName(cursor.getString(cursor.getColumnIndex("name")));
                person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
                person.setSex(cursor.getString(cursor.getColumnIndex("sex")));
                persons.add(person);
            }
        } catch (Exception e) {
            Log.e(SimpleClassName + " findList2", e.getMessage());
        }
        return persons;
    }

    public long findCount() {
        try (Cursor cursor = helper.getReadableDatabase().rawQuery("select count(person_id) from person ", null)) {
            if (cursor.moveToFirst()) {// 如果没有数据会返回false
                return cursor.getLong(0);
            }
        } catch (Exception e) {
            Log.e(SimpleClassName + " findCount", e.getMessage());
        }
        return 0;
    }

    public long findCount2() {
        String[] columns = { "count(person_id)" };
        try (Cursor cursor = helper.getReadableDatabase().query("person", columns, null, null, null, null, null)) {
            if (cursor.moveToFirst()) {// 如果没有数据会返回false
                return cursor.getLong(0);
            }
        } catch (Exception e) {
            Log.e(SimpleClassName + " findCount2", e.getMessage());
        }
        return 0;
    }
}

© 著作权归作者所有

思想永无止境
粉丝 4
博文 257
码字总数 292814
作品 0
昌平
程序员
私信 提问
手机开发-如何查看android数据文件和数据库

在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看。android项目中的sqlite数据库位于/data/data/项目包/databases中。 工具/原料 doc命令adb工具,ecl...

娶到笨笨
2014/03/14
0
0
Android 开发中使用 SQLite 数据库

SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都...

红薯
2010/08/22
67.2K
32
SQLite命令行访问Android数据库

登录Android Shell D:android-sdk-windowsplatform-toolsadb shell 应该出现#提示,如果是$提示,请按照上面链接获取ROOT权限。 sqlite命令 sqlite3 /data/data/com.easymorse.demo/files/my......

xiahuawuyu
2013/01/06
0
0
Android SMS(二)—— 读取短信保存到 SQLite

Android 之 SMS 短信在Android系统中是保存在SQLite数据库中的,但不让其它程序访问(Android系统的安全机制) 现在我们在读取手机内的SMS短信,先保存在我们自己定义的SQLite数据库中,然后...

长平狐
2013/01/06
418
0
Android:SharedPreferences解析和实现记住用户名

SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,它提供了Android平台常规的Long长整形、Int整形、String字符串型的保存。S...

岑浩源
2012/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 Java语法教程 Java语言的跨平台特性

什么是平台 Java是可以跨平台的编程语言,那么首先我们需要知道什么是平台,通常我们把CPU与操作系统的整体称为平台。 CPU大家都知道,是计算机的大脑,它既负责思维运算,又负责计算机中各种...

老码农的一亩三分地
27分钟前
0
0
http传值问题

这两天遇到一个问题 ,与一个渠道联调接口,http请求,展示ptf 的需求,服务方以一个二进制的方式返回。 当时我们在一开始开发的时候,我们按照读取文件的方式处理,本地存一个ptf 的方式 ,...

鬼才王
36分钟前
3
0
【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看

不是线程的安全 面试官问:“什么是线程安全”,如果你不能很好的回答,那就请往下看吧。 论语中有句话叫“学而优则仕”,相信很多人都觉得是“学习好了可以做官”。然而,这样理解却是错的。...

中关村的老男孩
36分钟前
5
0
5.01- Druid数据源配置

1、配置项 配置 缺省值 说明 name 无 配置这个属性的意义在于,如果存在多个数据源,监控的时候 可以通过名字来区分开来。如果没有配置,将会生成一个名字, 格式是:"DataSource-" + Syste...

静以修身2025
41分钟前
4
0
itop4412开发板-Linux内核的编译

本篇文章基于itop4412开发板 5.3.2.1源码目录 Linux 内核源码在光盘“06_源码_uboot 和 kernel”目录下,如下图所示。 5.3.2.2 编译器 内核的编译器和 uboot 的编译器一样,参考“5.3.1.2 编...

书白
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部