• Android开发03


    数据储存

    已知的数据存储方式

    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);
        }
    }
  • 相关阅读:
    springboot之手动控制事务
    Java的几种常见排序算法
    Java之协程(quasar)
    中文字符和中文标点符号的正则表达式
    【转】SignalR与ActiveMQ结合构建实时通信
    【转】根据Quartz-Cron表达式获取最近几次执行时间
    【转】IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
    【转】C# 中Linq查询所有上级节点或所有下级节点
    【转】FluentAPI详细用法
    【转】SQL数据库日志文件收缩
  • 原文地址:https://www.cnblogs.com/adventurer/p/5521953.html
Copyright © 2020-2023  润新知