Android 个人理财工具二:使用SQLite实现启动时初始化数据

   关于SQLite

sqlite是嵌入式SQL数据库引擎SQLite(SQLite Embeddable SQL Database Engine)的一个扩展。SQLite是一个实现嵌入式SQL数据库引擎小型C语言库(C library),实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:事务操作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后。 零配置——不需要安装和管理。 实现了绝大多数SQL92标准。

我在多年前就关注sqlite的发展,非常看好sqlite的前景,因为在移动、嵌入式的应用里面,sqlite具有非常好的特性来满足需求。

早在symbian 9.0 之前,openc 出来后,我就研究sqlite到symbian的移植。后来symbian9.3 nokia就已经集成了sqlite。

至今j2me还不支持sqlite,可以说是个遗憾。

现在我们来看看android sqlitedatabase 包里面的关键api:

Java代码

static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) //打开数据库
Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) //执行查询SQL
void execSQL(String sql) //执行非查询sql

sdk 1.0 关于cursor和sqlite的相关api对于前面的版本改变很多。

我觉得关键是没了query(String sql)这个简单的方法了,很不爽。

不过如果你对新的query方法了解深入点,发现其实也就一样。

       实例代码

我们来看两个例子。

Java代码

//执行select type,name from sqlite_master where name='colaconfig'
String col[] = {"type", "name" };
 Cursor c =db.query("sqlite_master", col, "name='colaconfig'", null, null, null, null);
 int n=c.getCount();
//执行多表查询
//select fee,desc from acctite a,bills b where a.id=b.id
String col2[] = {"fee", "desc" };
Cursor c2 =db.query("acctitem a,bills b", col, "a.id=b.id", null, null, null, null);
int n2=c2.getCount();
Log.v("cola","c2.getCount="+n2+""); 

c2.moveToFirst();
int k = 0;
while(!c2.isAfterLast()){
 String ss = c2.getString(0) +", "+ c2.getString(1);
 c2.moveToNext(); 

 Log.v("cola","ss="+ss+"");
}

现在来看看我们如何在这个理财工具里面应用它。

我们需要在程序的第一次启动时,创建数据库,然后把基本的表创建好,并且初始化好账目表。

对于上一篇中的initapp方法,我们需要改造成:

Java代码

public void initApp(){
 BilldbHelper billdb=new BilldbHelper(this);
 billdb.FirstStart();
 billdb.close();
}

下面我们给出BilldbHelper.java 代码:

Java代码

package com.cola.ui;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
/**
 * Provides access to a database of notes. Each note has a title, the note
 * itself, a creation date and a modified data.
 */
public class BilldbHelper {
 private static final String TAG = "Cola_BilldbHelper";
 private static final String DATABASE_NAME = "cola.db"; 

 SQLiteDatabase db;
 Context context; 

 BilldbHelper(Context _context) {
 context=_context;
 db=context.openOrCreateDatabase(DATABASE_NAME, 0, null); //创建数据库
 Log.v(TAG,"db path="+db.getPath());
 } 

 public void CreateTable_acctitem() {
 try{
 db.execSQL("CREATE TABLE acctitem (" //创建账目表
  + "ID INTEGER PRIMARY KEY,"
  + "PID integer,"
  + "NAME TEXT,"
  + "TYPE INTEGER"
  + ");");
 Log.v("cola","Create Table acctitem ok");
 }catch(Exception e){
 Log.v("cola","Create Table acctitem err,table exists.");
 }
 } 

 public void CreateTable_bills() {
 try{
 db.execSQL("CREATE TABLE bills ("
  + "ID INTEGER PRIMARY KEY,"
  + "fee integer,"
  + "userid integer,"
  + "sdate TEXT,"
  + "stime TEXT,"
  + "desc TEXT"
  + ");");
 Log.v("cola","Create Table acctitem ok");
 }catch(Exception e){
 Log.v("cola","Create Table acctitem err,table exists.");
 }
 } 

 public void CreateTable_colaconfig() {
 try{
 db.execSQL("CREATE TABLE colaconfig ("
  + "ID INTEGER PRIMARY KEY,"
  + "NAME TEXT"
  + ");");
 Log.v("cola","Create Table colaconfig ok");
 }catch(Exception e){
 Log.v("cola","Create Table acctitem err,table exists.");
 }
 } 

 public void InitAcctitem() { 

 db.execSQL("insert into acctitem values (100,0,'收入',0)");
 db.execSQL("insert into acctitem values (100100,100,'工资',0)");
 db.execSQL("insert into acctitem values (200,0,'支出',1)");
 db.execSQL("insert into acctitem values (200100,200,'生活用品',1)");
 db.execSQL("insert into acctitem values (200101,200,'水电煤气费',1)");
 db.execSQL("insert into acctitem values (200103,200,'汽油费',1)");
 Log.v("cola","insert into ok"); 

 } 

 public void QueryTable_acctitem(){ 

 } 

 public void FirstStart(){
 //如果是第一次启动,就不存在colaconfig这张表.
 try{
 String col[] = {"type", "name" };
 Cursor c =db.query("sqlite_master", col, "name='colaconfig'", null, null, null, null);
 int n=c.getCount();
 if (c.getCount()==0){
 CreateTable_acctitem();
 CreateTable_colaconfig();
 CreateTable_bills();
 InitAcctitem(); 

 } 

 Log.v("cola","c.getCount="+n+""); 

 }catch(Exception e){
 Log.v("cola","e="+e.getMessage());
 } 

 } 

 public void close(){
 db.close();
 }
}

系列文章:

Android 个人理财工具六:显示账单明细 下

Android 个人理财工具五:显示账单明细 上

Android 个人理财工具四:添加账单页面 下

Android 个人理财工具三:添加账单页面 上

Android 个人理财工具二:使用SQLite实现启动时初始化数据

Android 个人理财工具一:项目概述与启动界面的实现

以上就是对Android SQL的讲解及实例,后续继续做个人理财项目,谢谢大家支持!

(0)

相关推荐

  • Android开发之ListView、GridView 详解及示例代码

    ListView与GridView是Android开发中的常用控件,它们和Adapter配合使用能够实现很多界面效果.下面分别以实例说明ListView.GridView的用法.        1.ListView的Android开发实例 ListView 是android开发中最常用的控件之一,一般构成列表包括三个元素,ListView:用来展示列表的视图.Adapter:数据与视图连接的桥梁.Data:具体的数据包括字符串 .图片或者控件. 适配器一般有以下几种类型: ArrayAdapte

  • Android 个人理财工具五:显示账单明细 上

    前面我们已经将每个月的收支明细存入到SQLite的数据表中,本文将实现从SQLite的数据表中取出这些数据显示为账单明细界面. 下图是最终的效果图: 在设计该界面时我考虑过好几个方案.本来准备使用一个gridview,因为觉得名字很像我需要的东西.可是后来查了一些资料,并且做了点实验,发现和我想象的有些差距.于是采用了目前这种方式.使用Listview. 这个界面布局实际上很简单,就是上面一个表头(Linearlayout),中间一个Listview,下面是一个脚注(Linearlayout).

  • Android 个人理财工具一:项目概述与启动界面的实现

    从本文开始为大家制作一个Android个人理财工具,并把整个开发过程记录下来,与大家分享.   项目总体介绍 此Android个人理财工具的主要功能是,可以录入日常生活中的各类收入和支出明细,并且可以在每月底能够统计每月各类情况.给出收支关系饼图,月份之间的柱状图等报告. 下图是程序的流程图: 程序可能涉及到的技术: 1.多个视图的切换,参数的传递,intent的使用. 2.Grid 明细的体现. 3.sqlite数据的操作. 4.自绘view 来表现统计图. 先写这些.        启动界面

  • Android 应用中插入广告的实例

    想必大家都知道,国内的Android应用基本都是免费的,那么开发者如何获得收入呢?应用中插入广告是一个比较常用的盈利手段.本文就讲解如何在Android应用中插入广告. 国内的广告平台有很多,用户数量比较多的有万普,有米,多普.下面就不一一介绍了,免得说我打广告.本文以万普为例.   1.首先去万普官网下载sdk,把sdk里面的jar包导入到项目的lib目录下.        2.修改AndroidManifest.xml文件. 确保应用具有以下几项权限: XML/HTML代码 <uses-pe

  • Android 个人理财工具二:使用SQLite实现启动时初始化数据

       关于SQLite sqlite是嵌入式SQL数据库引擎SQLite(SQLite Embeddable SQL Database Engine)的一个扩展.SQLite是一个实现嵌入式SQL数据库引擎小型C语言库(C library),实现了独立的,可嵌入的,零配置的SQL数据库引擎.特性包括:事务操作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后. 零配置--不需要安装和管理. 实现了绝大多数SQL92标准. 我在多年前就关注sqlite的发展,非常看好sqlite的前景,

  • Android 个人理财工具三:添加账单页面 上

    ColaBox 登记收支记录终于进入了复杂阶段了.这个界面我也是查找了很多资料以及打开android的源代码看了后才完成了,现在想来Google的开源真是明智的啊. 从前面的登录页面跳转进入添加账单页面.这个页面主要是用来登记收支记录的.说白了就是往数据库录入明细. 表结构如下: db.execSQL("CREATE TABLE bills ("                  + "_ID INTEGER PRIMARY KEY," //id          

  • Android 个人理财工具四:添加账单页面 下

    本文考虑把账单界面整理下,实现如下图中的功能.做之前感觉应该不难,但实际做时发现排列界面布局甚至比编写程序代码还要复杂.网上搜索发现,关于这种布局的资料能用的很少,Google Demo中用的最多的就是Listview了,但本实例的界面似乎要复杂一些. spinner和cursor如何配合使用成了完成此实例过程中的难点,本来应该很简单,但却把我郁闷坏了. 先给大家贴上最终的效果图片: 界面的xml: XML/HTML代码 <?xml version="1.0" encoding=

  • Android 音乐播放器的开发实例详解

    本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的快进快退等. 先欣赏下本实例完成后运行的界面效果: 首先我们建立项目,我使用的SDK是Android2.2的,然后在XML中进行布局. 上方是一个ListView用来显示我们的音乐列表,中间是一个SeekBar可以拖动当前音乐的播放进度,之所以用SeekBar而不用ProgressBar是因为我们需

  • springboot 启动时初始化数据库的步骤

    问题描述 在spring-boot启动时,希望能执行相应的sql文件来初始化数据库. 使用配置文件初始化数据库 可以在spring-boot的配置文件application.yml中设置要初始化的sql文件.这是最简单的方法,只需要添加属性就可以实现. 首先设置spring.datasource.initialization-mode=always表示任何类型数据库都进行数据库初始化,默认情况下,spring-boot会自动加载data.sql或data-${platform}.sql文件来初始

  • springboot使用CommandLineRunner解决项目启动时初始化资源的操作

    前言: 在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等. 今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资源操作. 这个神器就是 CommandLineRunner,CommandLineRunner 接口的 Component 会在所有 Spring Beans 都初始化之后,SpringApplication.run() 之前执行,非常适合在应用程序启动之初进行一些数据初始化的工作. 正文

  • Docker容器启动时初始化Mysql数据库的方法

    1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. 第一种方案是在容器启动后手动导入,太low了不行.第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用flyway进行数据库版本控制一文,但是这依赖客户端的能力.能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下.全部代码见文末. 2.

  • Spring Boot解决项目启动时初始化资源的方法

    前言 在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资源操作. 这个神器就是 CommandLineRunner, CommandLineRunner 接口的 Component 会在所有 SpringBeans都初始化之后, SpringApplication.run()之前执行,非常适合在应用程序启动之初进行一些数据初始化的工作. 接下来我们

  • Android 个人理财工具六:显示账单明细 下

    上一节的显示账单明细 上中,账单明细的显示已经基本实现,本文主要整理下代码,实现此窗口的查询和删除功能:按下Menu菜单时弹出选择月份的窗口,可选择明细的月份:在ListView上长按可弹出确认删除的对话框,以完成删除. 下面上图: 这里面有个OnItemLongClickListener 事件,这个事件的用法如下: 首先activity 里面implements OnItemLongClickListener,然后如下面的代码所写: Java代码 // 这里listview 添加侦听事件 lv

随机推荐