码迷,mamicode.com
首页 > 移动开发 > 详细

Android开发03

时间:2016-05-24 00:13:57      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

数据储存

已知的数据存储方式

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就崩掉了,所以如果数据可能较大的情况下不要用这种方法,其实八千很少了,因为随便一所学校,医院的数据库信息就不止这些)

谷歌默认的手机运行内存(单个应用程序分配的内存)大概100mb,以前为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);
    }
}

 

Android开发03

标签:

原文地址:http://www.cnblogs.com/adventurer/p/5521953.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!