标签:
数据储存
已知的数据存储方式
1,文件存储
2,sharedPerference
3,数据库
数据库sqlite:
开源项目,由C实现,嵌入式的数据库,支持事务的数据库ios,windos都是采用的sqlite数据,轻量级的数据库,使用起来很方便
参考文件的创建:创建一个file引用,通过输出流向文件写数据,就会自动创建一个文件(file类中也有专门的方法创建文件,或文件夹)
数据库的创建
1,创建一个帮助类,继承SqLiteOpenHelper
2,自动创建调用父类的有参构造super(context,文件名,游标工厂(null,默认的),版本)
//注意,如果方法内写死了字符串,最好把这些字符串提取为成员变量
Context :上下文
游标工厂CursorFactory:类似文件的索引,指针,在android中为null即可,在服务器中,如果数据非常大的话,会自定义游标工厂,制定索引,跳到对应位置,提高效率
3.创建该类对象,调用
需要读信息的时候:对象名.getReadableDatabase();
需要写信息的时候:对象名.getWritableDatabase();
这两个方法底层都调用了getDatabaseLocked()面试可能会用到!
4,执行sql语句 在该类中调用db.execSQL(sql)方法
//
数据库语句,
创建表格时,指定的长度或者数据类型SQLite中其实是无效的,因为它都会转换成字符串,之所以要这样写,是为了方便程序员判断
insert into student(name,phone) values(‘zs’,110);给对应的字段添加记录
(自动增长的条目不需要添加,会自动增长)
Delete from student where name=’xxxx’(根据名字删除行)
Update student set phone=’xxx’ where name=’zs’(根据名字修改值)
Select * from student (查询全部内容)
Alter student add account varchar(20) 对student进行增加一列account
//继承方法分析
//这个方法只有数据库第一次被创建时才会调用,db代表当前数据库,一般用来创建表
public void onCreate(SQLiteDatabase db)
//这个方法是数据库发生更新时调用,例如版本更新(版本只能增加,不能减少)
//当有多个版本的时候,可以对oldVersion进行判断,进行对应的更新
//如果有多个版本的更新,可以提示用户删除原有程序,重新下载
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
5,SQLiteDatabase 中的方法
execSQL(sql);执行一条sql语句,增删改都可以
execSQL(sql,Object[]);执行一条sql语句,允许有占位符,对应的数据要在Object[]数组中,同样支持的是增删改
注意:这里可以在方法上定义文档注释,这样在创建对象的时候可以通过帮助信息看到该方法的信息介绍
6,其它:通过DOS命令查看表信息
6.1 adb shell 切换至设备控制台
6.2 cd /data/data/包名/数据库包名
6.3 -ls -l 查看当前文件夹下的文件
6.4 Sqlite3 数据库文件名.db 打开数据库
出现sqlite>光标等待的时候,就可以输入对应的指令了
如果表中出现乱码了,退出控制台,重新打开,输入 chcp 65001可以切换为utf-8,默认的编码里没有中文,同时字体不要选点矩阵(在左上角属性中)
练习:学生信息管理系统
MainActivity :主界面
StudentDao:学生类数据库处理
Student:学生类封装对象
StudentDBOpenHelper:数据库创建帮助类
TestStudentDao:学生类数据库测试类
ScrollView:可以滚动的View
AddView(View)添加一个子控件
removeAllView():清空所有控件
额外:实际开发中,把要初始化的控件,或者要初始化的信息,单独抽取出来初始化
例如:initView();
initData();
initLinstener();
Cursor 中有一个方法可以通过列名称获得对应列的数字
但是,上面这种方法,不断创建控件,添加控件,效率较低,而且容易内存溢出,程序崩溃(差不多八千左右APP就崩掉了,所以如果数据可能较大的情况下不要用这种方法,其实八千很少了,因为随便一所学校,医院的数据库信息就不止这些)
谷歌默认的手机运行内存(单个应用程序分配的内存)大概100多mb,以前为16mb,开发中尽量以最低内存开发,这样开发出来的效率最高(因为低内存都能运行,高内存就更没问题了)
7,ListView控件,即使有100万个item要显示,也能承受
ListView是基于mvc模式(web中有提过,这里再提一次)
M:model数据模型
V:View 界面展现
C:Control 控制器
7.1简介
①定义控件ListView,并找到它
②设置适配器,用来控制ListView如何显示lv.setAdapter(adapter)这里是一个接口,可以自定义,也可以匿名内部类.但是方法太多,所以可以通过实现类来定义,继承实现类(一般命名为BaseXXX,SimpleXXX,DefalutXXX)BaseAdapter类来实现方法
③重要方法 getCount()返回item数量
getView(int position,View converView,ViewGroup parent)返回某个位置显示的View对象,
④ListView实现的原理,它会让显示页面只实现当前界面上的item,超出页面的item就会变成垃圾回收,如果用户拖动页面,溢出页面的item就被回收,进入页面显示的item就被创建显示,所以应用程序显示页面上总共也就这几个item,不会内存溢出挂掉
package com.zzx.onclick; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener{ private Button bt1; private Button bt2; private Button bt3; private Button bt4; private Button bt5; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1,获取4个按钮 bt1 = (Button) findViewById(R.id.Button1); bt2 = (Button) findViewById(R.id.Button2); bt3 = (Button) findViewById(R.id.Button3); bt4 = (Button) findViewById(R.id.Button4); bt1.setOnClickListener(new MyOnclick()); //3,第二种方法,匿名内部类,new OnclickListener,但是按钮比较多就不方便 bt2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "2222", 0).show(); } }); bt3.setOnClickListener(this); bt4.setOnClickListener(this); } //4,第三种方法,当前MainActivity继承OnClickListener类,重写方法,在方法内部做判断,判断是哪一个id @Override public void onClick(View v){ switch (v.getId()) { case R.id.Button3: Toast.makeText(MainActivity.this, "3333", 0).show(); break; case R.id.Button4: Toast.makeText(MainActivity.this, "4444", 0).show(); break; } } //5,第四种方法,在按钮标签内定义一个onclick属性,指向对应的方法名,类似js中的单击事件 public void click(View v){ Toast.makeText(MainActivity.this, "5555", 0).show(); } //2,第一种方法,创建自定义类,这个类要是内部类,才能用到this,实现OnclickListener接口 private class MyOnclick implements OnClickListener{ @Override public void onClick(View v){ Toast.makeText(MainActivity.this, "1111", 0).show(); } } }
SQLite数据库开启类
package com.zzx.db3.dao; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; /** * 这个类用来实现数据库的创建操作 * @author msi * */ public class MyDBOpenHelper extends SQLiteOpenHelper{ private static final String name = "MyStudent"; private static final CursorFactory factory = null; private static final int version = 1; public MyDBOpenHelper(Context context) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { //创建表格 db.execSQL("create table student(_id integer primary key autoincrement ,name varchar(40),sex varchar(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
SQLite增删改查
package com.zzx.db3.daoImp; import java.util.LinkedList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import com.zzx.db3.dao.MyDBOpenHelper; import com.zzx.domain.Student; /** * 这个类用来实现数据库的增删改查 * @author msi * */ public class SQLService { private static final String add = "insert into student (name,sex) values(?,?)"; private static final String delete = "delete from student where name=?"; private static final String update = "update student set sex=? where name=?"; private static final String select = "select * from student where name=?"; private static final String tag = SQLService.class.getSimpleName(); //定义成员变量,方便操作,同时要使用这个类就要求一定要传入上问问 private MyDBOpenHelper helper; private Cursor cursor; public SQLService(Context context) { super(); helper =new MyDBOpenHelper(context); } /** * 增加信息 * name为学生姓名,sex为学生性别 * @param name * @param hight */ public void add(String name,String sex){ //创建一个可读的数据库 SQLiteDatabase sd = helper.getWritableDatabase(); sd.execSQL(add,new Object[]{name,sex}); sd.close(); } /** * 通过名字删除信息 * @param name */ public void delete(String name){ //创建一个可读的数据库 SQLiteDatabase sd = helper.getWritableDatabase(); sd.execSQL(delete,new Object[]{name}); sd.close(); } /** * 根据名称修改信息 * @param name */ public void update(String name,String nsex){ //创建一个可读的数据库 SQLiteDatabase sd = helper.getWritableDatabase(); sd.execSQL(update,new Object[]{nsex,name}); sd.close(); } /** * 根据姓名查询信息,返回为null就不存在 * @param name */ public String select(String name){ //创建一个可读的数据库 SQLiteDatabase sd = helper.getWritableDatabase(); cursor = sd.rawQuery(select, new String[]{name}); Student s = null; if(cursor.moveToNext()){ s =new Student(); String id = cursor.getString(0); String sname = cursor.getString(1); int hi = cursor.getColumnIndex("sex"); String sex = cursor.getString(hi); s.setId(id); s.setName(sname); s.setHeight(sex); System.out.println(hi); } sd.close(); if(s!=null){ return s.toString() ; }else{ return null; } } /** * 这个类用来获取所有学生信息的集合 * @return */ public List<Student> getAll() { //创建集合保存信息 List<Student> students = new LinkedList<Student>(); SQLiteDatabase sd = helper.getReadableDatabase(); cursor = sd.rawQuery("select * from student", null); //将读取到的信息封装起来 while(cursor.moveToNext()){ Student s = new Student(); String name = cursor.getString(cursor.getColumnIndex("name")); String sex = cursor.getString(cursor.getColumnIndex("sex")); String id = cursor.getString(0); s.setId(id); s.setName(name); s.setHeight(sex); students.add(s); } //关流,返回数据 sd.close(); return students; } }
数据库操作类的单元测试
package com.zzx.test; import com.zzx.db3.daoImp.SQLService; import android.test.AndroidTestCase; public class TestSQLService extends AndroidTestCase{ //测试增加的方法 public void Testadd() throws Exception{ SQLService sql = new SQLService(getContext()); sql.add("张三", "168"); } //测试删除的方法 public void TestDelete() throws Exception{ SQLService sql = new SQLService(getContext()); sql.delete("张三"); } //测试修改的方法 public void TestUpdate() throws Exception{ SQLService sql = new SQLService(getContext()); sql.update("张三", "170"); } //测试查询的方法 public void TestSelect() throws Exception{ SQLService sql = new SQLService(getContext()); String s = sql.select("张三"); if(s!=null) System.out.println(s); } }
标签:
原文地址:http://www.cnblogs.com/adventurer/p/5521953.html