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

一、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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹叁零壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值