Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都相当出色,功能也非常的强大。SQLite具备下列特点:
  1.轻量级
  使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。
  2.独立性
  SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
  3.隔离性
  SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。
  4.跨平台
  SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。
  5.多语言接口
  SQLite 数据库支持多语言编程接口。
  6.安全性

  SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。

创建数据库的方法,在android开发中,要想为项目创建数据库,必须继承SQLiteOpenHelper类

  首先,我们创建一个类来继承SQLiteOpenHelper类

  

 package com.example.sqlltetest;

 import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; public class MyDataBaseOpenOrCreate extends SQLiteOpenHelper{ private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = ; // 数据库版本 public MyDataBaseOpenOrCreate(Context context) {
super(context, DB_NAME, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
Log.i("tag", "欢迎你的加入");
String sql_table = "create table t_student(stuid integer primary key autoincrement,stuName varchar(50))";
db.execSQL(sql_table);
String sql_1 = "insert into t_student(stuName) values ('小波')";
String sql_2 = "insert into t_student(stuName) values ('小小波')";
String sql_3 = "insert into t_student(stuName) values ('小小小波')";
db.execSQL(sql_1);
db.execSQL(sql_2);
db.execSQL(sql_3);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newversion) { } }

如过你的项目没有数据库的化,他会走onCreate()的方法,如果有的话,他是不会走onCreate()方法的,至于onUpgrade()方法,是当你数据库发生更新时触发的,上面我们通过日志打印来测试

那么我们创建一个实体类来关联数据库

 package com.example.entity;

 public class student {

     private String stuid;
private String stuName;
private int age;//为了升级做准备的
public String getStuid() {
return stuid;
}
public void setStuid(String stuid) {
this.stuid = stuid;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }

后面我们直接通过程序来显示数据

  

 package com.example.sqlltetest;

 import java.util.*;

 import com.example.entity.student;

 import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { private ListView lv;
private List<student> list = new ArrayList<student>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); MyDataBaseOpenOrCreate myDataBase = new MyDataBaseOpenOrCreate(
MainActivity.this);
SQLiteDatabase db = myDataBase.getWritableDatabase();
Log.i("tag", "创建数据库完成");
Cursor cursor = db.query("t_student", null, null, null, null, null,
null);
while (cursor.moveToNext()) {
student s = new student();
s.setStuName(cursor.getString(cursor.getColumnIndex("stuName"))); list.add(s);
}
db.close();
lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(new BaseAdapter() { // 返回多少条记录
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
} // 每一个item项,返回一次界面
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null; LayoutInflater inflater = MainActivity.this.getLayoutInflater();
// 因为getView()返回的对象,adapter会自动赋给ListView
view = inflater.inflate(R.layout.list_item, null); student m = list.get(position); TextView tv_stuName = (TextView) view
.findViewById(R.id.tv_stuName);
tv_stuName.setText(m.getStuName()); return view;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return ;
} });
} }

显示的结果:

  

当我们第一次运行的时候,在日志中可以看到之前oncreate()方法中日志

但是当我们在重新运行一次的时候,日志是这样的

由此可见,只有我们数据库没有这个数据库的时候他才会走oncreate()方法。

因为我们创建的是app项目,会经常发生数据变化,所以我们就需要对数据库进行更新。

更新的思路:

当前版本 v1.0
  1.  没有安装过    会直接 走 onCreate()  
--------------------------------------
 当前版本 v2.0   [onUpgrade 情况:n-1,onCreate 情况:1]    升级就会直接走  onUpgrade() 方法
  1.  v1.0 --> v2.0  onUpgrade   
  2.  没有安装过       onCreate()  
-----------------------------------------
 当前版本 v3.0   [onUpgrade 情况:n-1,onCreate 情况:1]
  1.  v1.0 -->v3.0    onUpgrade   
      alter table t_message add column isdel bit default 0;
      插入数据
  2.  v2.0 -->v3.0    onUpgrade  
       alter table t_message add column isdel bit default 0;
  3.  没有安装过       onCreate()  
 
----------------------------------------------------------------------
 降级的设计关键点
1、考虑云端要保存用户【自定义数据、行为习惯】。专业术语profile-->>提高用户黏度
2、考虑[当前]的最低版本要求-->>降低维护成本
3、尽可能本地的数据转移(所有新版本,都不删除字段)-->尽可能把未知变已知
    try catch 
 
升级数据库的话,就在那个onUpgrade()方法中进行,我们把之前定义version(版本号)改为2,再在 onUpgrade()方法中修改数据库
  

 package com.example.sqlltetest;

 import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; public class MyDataBaseOpenOrCreate extends SQLiteOpenHelper{ private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = ; // 数据库版本 public MyDataBaseOpenOrCreate(Context context) {
super(context, DB_NAME, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
Log.i("tag", "欢迎你的加入");
String sql_table = "create table t_student(stuid integer primary key autoincrement,stuName varchar(50))";
db.execSQL(sql_table);
String sql_1 = "insert into t_student(stuName) values ('小波')";
String sql_2 = "insert into t_student(stuName) values ('小小波')";
String sql_3 = "insert into t_student(stuName) values ('小小小波')";
db.execSQL(sql_1);
db.execSQL(sql_2);
db.execSQL(sql_3);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newversion) {
if (oldVersion == ){
String sql_upgrade_1 = "alter table t_student add column age int default 18";
db.execSQL(sql_upgrade_1);
Log.i("db", "从1到2,升级成功!");
} } }

当然数据的改变,我们的显示也要跟着改变,我们对之前的MainActivity进行修改

  

 package com.example.sqlltetest;

 import java.util.*;

 import com.example.entity.student;

 import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { private ListView lv;
private List<student> list = new ArrayList<student>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); MyDataBaseOpenOrCreate myDataBase = new MyDataBaseOpenOrCreate(
MainActivity.this);
SQLiteDatabase db = myDataBase.getWritableDatabase();
Log.i("tag", "创建数据库完成");
Cursor cursor = db.query("t_student", null, null, null, null, null,
null);
while (cursor.moveToNext()) {
student s = new student();
s.setStuName(cursor.getString(cursor.getColumnIndex("stuName")));
s.setAge(cursor.getInt(cursor.getColumnIndex("age")));
list.add(s);
}
db.close();
lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(new BaseAdapter() { // 返回多少条记录
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
} // 每一个item项,返回一次界面
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null; // 布局不变,数据变 // 如果缓存为空,我们生成新的布局作为1个item
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
// 因为getView()返回的对象,adapter会自动赋给ListView
view = inflater.inflate(R.layout.list_item, null); student m = list.get(position); TextView tv_stuName = (TextView) view
.findViewById(R.id.tv_stuName);
tv_stuName.setText(m.getStuName()); TextView tv_Age = (TextView) view.findViewById(R.id.tv_age);
tv_Age.setText(m.getAge() + ""); return view;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return ;
} });
} }

下面我们看一下日志和结果:

好了,我们的数据库升级成功了,接着我们来尝试一下降级吧,

我们先把version(版本好)换成1

  

package com.example.sqlltetest;

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; public class MyDataBaseOpenOrCreate extends SQLiteOpenHelper{ private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = ; // 数据库版本 public MyDataBaseOpenOrCreate(Context context) {
super(context, DB_NAME, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
Log.i("tag", "欢迎你的加入");
String sql_table = "create table t_student(stuid integer primary key autoincrement,stuName varchar(50))";
db.execSQL(sql_table);
String sql_1 = "insert into t_student(stuName) values ('小波')";
String sql_2 = "insert into t_student(stuName) values ('小小波')";
String sql_3 = "insert into t_student(stuName) values ('小小小波')";
db.execSQL(sql_1);
db.execSQL(sql_2);
db.execSQL(sql_3);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newversion) {
if (oldVersion == ){
String sql_upgrade_1 = "alter table t_student add column age int default 18";
db.execSQL(sql_upgrade_1);
Log.i("db", "从1到2,升级成功!");
} } @Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
//第一、先把t_message 未来的表,改名
String rename_sql = "alter table t_student rename to t_student_bak";
db.execSQL(rename_sql);
Log.i("down", "1.改名成功");
//第二、建立降级的表名的表结构
String sql_message = "create table t_student(stuid integer primary key autoincrement,stuName varchar(50))";
db.execSQL(sql_message);
Log.i("down", "2.建立2.0表结构成功");
//第三、把备份的数据,copy到 新建的2.0的表(即将之前表名的数据插入到降级的版本中)
String sql_copy = "insert into t_student select stuName from t_student_bak";
db.execSQL(sql_copy);
Log.i("down", "3.copy到用户数据到 2.0的表");
//第四、把备份表drop掉
String drop_sql = "drop table if exists t_student_bak";
db.execSQL(drop_sql);
Log.i("down", "4.把备份表drop掉"); } catch (Exception e) {
//如果上面的方法不行,采取最暴力的行为,把表删了,重新建立一张之前版本的表
Log.i("hi", "降级失败,重新建立");
String sql_drop_old_table = "drop table if exists t_student";
String sql_message = "create table t_student(stuid integer primary key autoincrement,stuName varchar(50))";
String sql_init_1 = "insert into t_student(stuName) values ('小波')";
String sql_init_2 = "insert into t_student(stuName) values ('小明')";
String sql_init_3 = "insert into t_student(stuName) values ('小红')";
db.execSQL(sql_drop_old_table);
db.execSQL(sql_message);
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
}
} }
 package com.example.sqlltetest;

 import java.util.*;

 import com.example.entity.student;

 import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { private ListView lv;
private List<student> list = new ArrayList<student>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); MyDataBaseOpenOrCreate myDataBase = new MyDataBaseOpenOrCreate(
MainActivity.this);
SQLiteDatabase db = myDataBase.getWritableDatabase();
Log.i("tag", "创建数据库完成");
Cursor cursor = db.query("t_student", null, null, null, null, null,
null);
while (cursor.moveToNext()) {
student s = new student();
s.setStuName(cursor.getString(cursor.getColumnIndex("stuName")));
//s.setAge(cursor.getInt(cursor.getColumnIndex("age")));
list.add(s);
}
db.close();
lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(new BaseAdapter() { // 返回多少条记录
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
} // 每一个item项,返回一次界面
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null; // 布局不变,数据变 // 如果缓存为空,我们生成新的布局作为1个item
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
// 因为getView()返回的对象,adapter会自动赋给ListView
view = inflater.inflate(R.layout.list_item, null); student m = list.get(position); TextView tv_stuName = (TextView) view
.findViewById(R.id.tv_stuName);
tv_stuName.setText(m.getStuName()); /*TextView tv_Age = (TextView) view.findViewById(R.id.tv_age);
tv_Age.setText(m.getAge() + "");*/ return view;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return ;
} });
} }

结果:

因为我的数据主键用的是自增长,没有对数据降级的表的数据插入数据进行考虑,所以直接把之前那个表个删了在建一个新的。

Android菜鸟成长记11 -- sqlite数据库的设计和升降级的更多相关文章

  1. Android—SQLITE数据库的设计和升降级

    Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...

  2. Android菜鸟成长记12 -- ORMLite的简单使用

    在我们的开发中,为了提高开发效率,我们一般都会使用到框架,ormilte则是我们必不可少的数据库框架. 对于ORMLite我也是今天才刚刚接触,我们先从一个简单的项目来了解它吧. ORMLite ja ...

  3. Android菜鸟成长记10 -- ListVew

     ListView在我们学习Android的过程中是非常重要得一个部分. listview主要有两个职责 1)将数据填充到布局. 2)处理用户的选择点击等操作. 一个ListView的创建需要3个元素 ...

  4. Android菜鸟成长记5-ADB和sqllite

    Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Androi ...

  5. Android菜鸟成长记14 -- AsnyTask

    本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...

  6. Android菜鸟成长记13 -- 初识application

    二.Application 简介 Application 类是用来维护应用程序全局状态.你可以提供自己的实现,并在 AndroidManifest.xml文件的 <application> ...

  7. Android菜鸟成长记4-button点击事件

    Button 1.button按钮的创建 一般来说,在我们新建一个Android项目的时候,会有会默认有一个activity_main.xml的文件 如果你在新建项目的时候,把Create Activ ...

  8. Android菜鸟成长记16 -- JSON的解析

    JSON的定义  一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  9. Android菜鸟成长记15 -- BitMap

    BitMap简介 Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bi ...

随机推荐

  1. [手机取证] Apple Watch取证初探

    转载文章请注明出处 1. 关于Apple Watch 苹果公司在2015年3月正式发布了智能手表Apple Watch,包括Apple Watch.Apple Watch Sport以及Apple W ...

  2. 【HOW】如何配置SharePoint传入/传出电子邮件设置

    SharePoint 2010的传入和传出邮件配置选项都较简单,但由于需要DNS及Exchange等服务器互相配合,所以要正确配置并不容易. 在微软的官方文档中详细说明了配置步骤:配置传入电子邮件:h ...

  3. 第五届山东ACM大赛汇总

    A.angry_birds_again_and_again 简单积分: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem& ...

  4. cocos2d-x:懒人数学函数

    做游戏开发,要用到比较多的数学计算,对于程序员来说,还是用一种懒一点的方法,cocos2d-x方便开发者投机取巧...提供了很多方便的的数学函数,方便我们的数学计算.以下是在网上收集到的一些常用的数学 ...

  5. appium移动端测试之滑动(二)

    在ios测试中,需要用到滑动,所以用java封装了一套滑动的方法,不多说,贴代码 /** * 上滑1/4屏幕 */ public void slideUP1_4() { int x = driver. ...

  6. 使用appium进行ios测试,启动inspector时遇到的问题(一)

    最近在公司,让做ios的自动化测试,因为以前做过android的自动化测试,用的也是appium,觉得没什么,结果一开始在搭建环境就遇到了很多的问题,现在将我遇到的问题,以及解决方法,给大家分享出来. ...

  7. logging 日志模块学习

    logging 日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现. ...

  8. @RequestMapping用法详解

    @RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把 ...

  9. linux 进程的创建

    1. 进程号: 每个进程在被初始化的时候,系统都会为其分配一个唯一标识的进程id,称为进程号: 进程号的类型为pid_t,通过getpid()和getppid()可以获取当前进程号和当前进程的父进程的 ...

  10. js面向对象的实现(example 二)

    //这个方法和上篇文章(js面向对象的实现(example 一))中的方法类似,但是更为简洁 //通过函数赋值的方式来构造对象 //同样通过闭包的方式来封装对象及内部变量 (function () { ...