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

谷歌默认的手机运行内存(单个应用程序分配的内存)大概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);
    }
}
时间: 2024-08-15 00:33:58

Android开发03的相关文章

[Android系列—] 1. Android 开发环境搭建与Hello World

前言 開始之前先熟悉几个名词: SDK -- Software Development Kit, 软件开发工具包.这个词并不陌生, JDK,就是Jave Development Kit,相同对于Android 来说也有Android SDK. Android SDK 提供了构建,測试和调试安卓应用的API 库和开发人员工具. ADT- Android Developer Tools.安卓开发人员工具, 事实上这里就是Eclipse 用于Android 开发的插件. 高速开发环境搭建 在搭建And

Android开发中的MVP架构(转)

写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn=1cd10bd9efaac7083575367a8b4af52f&scene=1&srcid=0910ARzPpBvVYPI1NDBZnixa#wechat_redirect 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目

Android开发之资源文件存储

本文介绍在Android开发中关于资源文件的存储操作.对于Android资源也是非常重要的,主要包括文本字符串(strings).颜色(colors).数组(arrays).动画(anim).布局(layout).图像和图标(drawable).音频视频(media)和其他应用程序使用的组件. 在Android开发中,资源文件是我们使用频率最高的,无论是string,drawable,还是layout,这些资源都是我们经常使用到的,而且为我们的开发提供了很多方便,不过我们平时接触的资源目录一般都

Android开发书籍

Android编程指南.pdf 1327KB 2015/2/7 11:11:03 Download   Android开发教程笔记完全版.pdf 8170KB 2015/2/7 11:04:22 Download   Android开发教程.pdf 8170KB 2015/2/7 11:01:57 Download    

(转).net开发者对android开发一周的学习体会

春节期间,相对比较闲,上班时也没什么事情做.利用这一周的时间,简单的学习了一下移动方面的开发.主要是针对android,其实我对IOS更感兴趣 (因为我用iphone),苦于暂时没有苹果电脑,只能把它放到以后学习.我的工作中暂时没有用到移动方面的开发,自己以前也一直做.net方面的应用.在这里以一个.net开发人员的思维记一下对android开发学习中的一点自己的心得和体会.初学者的胡言乱语,高手请一笑而过. 开发环境搭建 先下载JDK安装.对于android的SDK和eclipse,可以直接到

Android开发网上的一些重要知识点[经验分享]

1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是startActivity可能会使用FLAG_ACTIVITY_NEW_TASK标记来打开一个新窗口,比如Launcher,所以考虑单任务的实现方法比较简单,首先Android123纠正下大家一种错误的方法就是直接在androidmanifest.xml的application节点中加入android

Android开发必备的21个免费资源和工具

转载自: http://blog.csdn.net/shimiso/article/details/6788375 Android移动开发平台现在不是一个“火”字能形容的,今年Android平台在市场占有率上相比去年取得的886%增长!如果我只看增长率,iPhone据统计才有61%的增长.而创造了山寨概念的联发科也在近期宣布将进军Android.这些事实可以给你关于两个平台流行度的印像,但是事实上,这些数据告诉了智能机开发员的谁才是真正的赢家.在时下,智能机越来越流行,因此成为一个快速增长的An

Android开发学习笔记:数据存取之SQLite浅析

一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl.PHP.Java.C++..Net等,还有ODBC接口,同样比起 Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的

2005年Android开发新技术盘点

又到年末, 利用中午的时间,汇总盘点一下今年Android开发方面的新技术,感觉现在Android开发没有以前那么纯粹了,出现了很多新的开发模式.2005年影响比较普遍的新技术应该就是Material Design了,毕竟现在的新手机系统基本都升到Android5.1了, 个别的手机已经升到Android 6了,其它例如DataBinding, RxAndroid,React native等的目前还是很小众,没有流行起来. 这几年在前端开发领域快速发展的影响下,Android开发也出现了很多原生