Android基础学习【历史流程重走】 ---- Sqlite数据库使用及ListView的使用与优化(三)

来源:互联网 发布:u盘安装centos双系统 编辑:程序博客网 时间:2024/04/28 06:24

一、Sqlite的基本使用

        Sqlite的使用主要分为三个步骤:1,构建数据库OpenHelper类;2,获取数据库对象;3,管理并使用数据库。

1,创建SqliteOpenHelper类

public class DataBaseOpenHelper extends SQLiteOpenHelper {    /**     * log日志标记,一般使用当前类类名【便于区分】     */    private String tag = "DataBaseOpenHelper";    private final static String DB_NAME = "first.db";//数据库名    private final static int VERSION = 1;//版本号    /**     * 构造方法     * <p/>     * Context context  上下文对象     * String name  数据文件对象名称【数据库文件名】     * SQLiteDatabase.CursorFactory factory   游标工厂     * int version   版本,最小为1     */    public DataBaseOpenHelper(Context context) {        /**         * 当前方法执行创建数据库文件         */        super(context, DB_NAME, null, VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {//SQLite中无数据实体类型    varchar(20)  20没有实际的意义        Log.i(tag, "数据库文件被创建了!");        String sql = "create table student(id integer primary key autoincrement,name varchar(20),age int)";        db.execSQL(sql);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        /**         * 数据库版本进行升级调用方法         * 用于保证数据库的数据兼容         * 【1-2】  【2-3】 【3-4】         * 会存在【1-3】 【2-4】等情形         *         * 【-------数据兼容处理-----】         *         * 插入数据表格单元列    更新属性等操作         */        Log.i(tag, "数据库版本更新!");        //tableName  先删除原有表格,再创建新的表格        db.execSQL("DROP TABLE IF EXISTS " + "tableName");        onCreate(db);    }}
2,获取数据库对象,并将数据库的基本操作封装工具

public class DataBaseDao {    /**     * 数据库文件创建Helper     */    private DataBaseOpenHelper helper;    public DataBaseDao(Context context) {        helper = new DataBaseOpenHelper(context);    }    /**     * 添加基础信息     *     * @param name 姓名     * @param age  年龄     */    public void add(String name, int age) {        SQLiteDatabase db = helper.getWritableDatabase();        db.execSQL("insert into student (name,age) values(?,?)", new Object[]{name, age});        db.close();    }    /**     * 根据核心字段删除对象     *     * @param name 核心字端 name     */    public void delete(String name) {        SQLiteDatabase db = helper.getWritableDatabase();        db.execSQL("delete from student where name=?", new Object[]{name});        db.close();    }    /**     * 依据关键字段更新信息     *     * @param name     * @param newAge     */    public void update(String name, int newAge) {        SQLiteDatabase db = helper.getWritableDatabase();        db.execSQL("update student set age=? where name =?", new Object[]{newAge, name});        db.close();    }    /**     * 依据关键字查询相关信息     *     * @param name     * @return     */    public int find(String name) {        SQLiteDatabase db = helper.getReadableDatabase();        int age = -1;        Cursor cursor = db.rawQuery("select age from student where name=?", new String[]{name});        if (cursor.moveToNext()) {            age = cursor.getInt(1);        }        cursor.close();        db.close();        return age;    }    /**     * 查找全部信息     *     * @return     */    public List<Student> findAll() {        List<Student> stus = new ArrayList<>();        SQLiteDatabase db = helper.getReadableDatabase();        Cursor cursor = db.rawQuery("select * from student", null);        while (cursor.moveToNext()) {            String name = cursor.getString(1);            int age = cursor.getInt(2);            Student stu = new Student();            stu.setName(name);            stu.setAge(age);            stus.add(stu);        }        cursor.close();        db.close();        return stus;    }}
3,使用系统API更换增删改查

public class DataBaseDaoAPI {    /**     * 数据库文件创建Helper     */    private DataBaseOpenHelper helper;    public DataBaseDaoAPI(Context context) {        helper = new DataBaseOpenHelper(context);    }    /**     * 添加基础信息     *     * @param name 姓名     * @param age  年龄     * @return 插入数据所在行数     */    public long add(String name, int age) {        SQLiteDatabase db = helper.getWritableDatabase();        ContentValues values = new ContentValues();        values.put("name", name);        values.put("age", age);        long result = db.insert("student", null, values);        db.close();        return result;    }    /**     * 根据核心字段删除对象     *     * @param name 核心字端 name     * @return 被删除数据的行数,0表示删除失败     */    public int delete(String name) {        SQLiteDatabase db = helper.getWritableDatabase();//        String table, String whereClause, String[] whereArgs        int result = db.delete("student", "name=?", new String[]{name});        db.close();        return result;    }    /**     * 依据关键字段更新信息     *     * @param name     * @param newAge     */    public int update(String name, int newAge) {        SQLiteDatabase db = helper.getWritableDatabase();//        String table, ContentValues values, String whereClause, String[] whereArgs        ContentValues values = new ContentValues();        values.put("age", newAge);        int result = db.update("student", values, "name=?", new String[]{name});        db.close();        return result;    }    /**     * 依据关键字查询相关信息     *     * @param name     * @return     */    public int find(String name) {        SQLiteDatabase db = helper.getReadableDatabase();        int age = -1;//        Cursor cursor = db.rawQuery("select age from student where name=?", new String[]{name});//        if (cursor.moveToNext()) {//            age = cursor.getInt(1);//        }//        String table, String[] columns,//                String selection, String[] selectionArgs, String groupBy,//                String having, String orderBy, String limit        Cursor cursor = db.query("student", new String[]{"age"}, "name=?", new String[]{name}, null, null, null);        age = cursor.getInt(0);        cursor.close();        db.close();        return age;    }    /**     * 查找全部信息     *     * @return     */    public List<Student> findAll() {        List<Student> stus = new ArrayList<>();        SQLiteDatabase db = helper.getReadableDatabase();        Cursor cursor = db.query("student", null, null, null, null, null, null);        while (cursor.moveToNext()) {            String name = cursor.getString(1);            int age = cursor.getInt(2);            Student stu = new Student();            stu.setName(name);            stu.setAge(age);            stus.add(stu);        }        cursor.close();        db.close();        return stus;    }}
4,使用dos命令查看执行结果

这里是源码~_~

二、ListView的优化【原理--实际使用会抽取成为工具】

1,item复用;
2,inflate--打气筒
3,BaseHolder抽取
4,不同Adapter的使用
       常用BaseAdapter
        SimpleAdapter  ListAdapter
ListAdapter的使用:

public class ListAdapterLV extends Activity {    /**     * ListView主体展示数据     */    private ListView lvBody;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_listview);        lvBody = (ListView) findViewById(R.id.lv_body_item);        String[] data = {"google", "amazon", "facebook"};        lvBody.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_single_choice, data));        lvBody.setItemsCanFocus(true);        lvBody.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);    }}
SimpleAdapter的使用:

public class SimpleAdapterLV extends Activity {    /**     * ListView主体展示数据     */    private ListView lvBody;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_listview);        /**         * 获取ListView控件         */        lvBody = (ListView) findViewById(R.id.lv_body_item);        /**         * 获取数据         */        DataBaseDao dao = new DataBaseDao(this);        ArrayList<Student> students = (ArrayList<Student>) dao.findAll();        /**         * 准备数据         */        List<Map<String, Object>> lvData = new ArrayList<>();        for (Student student : students) {            Map<String, Object> dataTemp = new HashMap<>();            dataTemp.put("姓名", student.getName());            dataTemp.put("年龄", student.getAge());            lvData.add(dataTemp);        }        /**         * 创建数据适配器         */        SimpleAdapter adapter = new SimpleAdapter(this, lvData, R.layout.listitem, new String[]{"姓名", "年龄"}, new int[]{R.id.TextView01, R.id.TextView02});        lvBody.setAdapter(adapter);    }}

SimpleAdapter展示效果:

SimpleAdapter
ListAdapter展示效果:

ListAdapter


三、Sqlite事务及扩展

public class MainActivity extends AppCompatActivity {    /**     * 确认转账按钮     */    private Button enSureTrans;    String s;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        enSureTrans = (Button) findViewById(R.id.ensure);        OpenHelper helper = new OpenHelper(MainActivity.this);        final SQLiteDatabase db = helper.getWritableDatabase();        String sql = "insert into account (name,money) values('zhangsan',10000) ";        db.execSQL(sql);        enSureTrans.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                db.beginTransaction();                try {                    db.execSQL("update account set  money = money-1000 where name = 'zhangsan'");//                    s.equals("success");                    db.execSQL("update account set money = money+1000 where name = 'lisi'");                    db.setTransactionSuccessful();                } finally {                    db.endTransaction();                }            }        });    }}
结果展示:

好东西,你懂得#_#

四、样式、主题、国际化

样式:values-styles中添加想要的样式,主题类似

    <style name="NewStyle">        <item name="android:windowNoTitle">true</item>        <item name="windowActionBar">false</item>        <item name="windowNoTitle">true</item>    </style>
国际化:创建不同的values文件夹

推荐他人博客,详细讲解了国际化的实现,记录国际化values命名规则。

国际化注意事项:在程序中不使用说明硬编码,全根据资源文件获取描述。

Resources resources = getResources();//获得res资源对象       Configuration config = resources.getConfiguration();//获得设置对象       DisplayMetrics dm = resources .getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。       config.locale = Locale.SIMPLIFIED_CHINESE; //简体中文       resources.updateConfiguration(config, dm);  



你引风雨来,我也不怨你,我打着雨伞多少与你同走一程可好?
你带沙尘来,我也不气你,我给我自己蒙上面巾,也给你一块可好?

你要是不愿意,那就算了罢,我自己一人独行,也有许多妙处可得。
你要是高兴,那就更好了,我与你说说这些年,我曾遇的那些人与风景。


0 0
原创粉丝点击