个人技术博客(α)

学习的内容与团队项目的关系

  • 学会使用Android studio这个Android集成开发工具
  • 学会SQLite这个Android自带的轻量级的数据库
  • 学会GitHub,配合团队对代码的上传请求合并和拉取

  在本次的团队项目中我负责本地数据库的部分,因为项目是用Android开发的,所以学习使用SQLite数据库。并在这个过程中了解了Android studio一些基础应用,和xml布局的一些知识。


学习过程

1、学习的资料

2、环境的搭建

3、学习《第一行代码》上的demo和adb调试

  首次学习写Android,需要对整体以及基础的知识有个大概的了解。而郭霖大大的《第一行代码——Android》就非常好。就大概翻了翻前面几章内容,然后因为我具体是写后端数据库的,就侧重学习下第六章。然后依据上面的一个例子我一行一行跟着打代码,完成了第一个demo。
在Genymotion模拟器上的运行

在日志上查看

adb(Android Debug Bridge)的调试:
  上面的代码是在手机上创建一个数据库,并对数据库进行增删查改。那么创建的这个数据库在哪里,我们能否直接对这个数据库进行操作?答案当然是可以。
  adb是用来管理模拟器和真机的通用调试工具,该工具功能强大,直接打开cmd即可使用adb命令,adb的全称为Android Debug Bridge,是起到调试桥的作用,通过adb我们可以用来调试Android程序,说白了就是debug工具,也就可以使用adb来操作我们创建的数据库。(当然有一个前提:使用的真机或模拟器是root过的)
  一般adb.exe位于SDK\platform-tools 的文件夹下,在该目录下打开cmd命令行,输入adb shell即可进入调试模式(要求这时的连着真机或开着模拟器):

创建的数据库和表:

4、自己尝试写一个demo和源代码学习

  前面是完全依据《第一行代码》的书上的代码来打,这次则是依据自己的学习了解尝试自己写一个小demo,这同样也只是实现数据库的创建、数据增删查改基础的功能,

  • 使用数据库时用到的三个类:
    • SQLiteOpenHelper:抽象类,我们通过继承该类,然后重写数据库创建以及更新的方法, 我们还可以通过该类的对象获得数据库实例,或者关闭数据库!
    • SQLiteDatabase:数据库访问类:我们可以通过该类的对象来对数据库做一些增删改查的操作
    • Cursor:游标,有点类似于JDBC里的resultset,结果集!可以简单理解为指向数据库中某 一个记录的指针!
  • 直接使用SQL语句:
    db.execSQL(“ SQL语句 ” );
    使用这个函数可以直接执行SQL语句,好处是简单,可以直接使用大二学的SQL知识,但缺点是每次只能执行一条SQL语句,若数据太多就要重复多遍,而且不论执行成功与否都没有返回。
  • 使用Android提供的API操作SQLite
    • db.insert()、 db.query()、db.delete()、 db.update()
      调试下bug后能在模拟器上跑起来:

之后就是在网上学习比较优秀的项目的源代码,像我同学给我推荐的一个《时光记》APP的源代码:Git链接

5、开始团队项目的数据库开发

  首先是一份接口文档,通过接口文档前端就可以通过这个函数实现对数据库的操作了。完整的上传到git上了,下面是部分:

新建数据库操作类:
		databaseManage = new DatabaseManage(this);

	对 Character 表:		
		插入一条人物记录:public long insertCharacter(Character character) ,成功返回值大于0,失败返回值小于0,已经存在账号返回0
		查询人物全属性:public Character queryCharacter()  ,查询失败返回的 Character 类为空				
		查询人物姓名:public String queryCHName() ,查询成功返回名字,失败返回空字符串
		查询人物活力:public int queryCHCurrentEnergy()  ,查询成功返回活力,失败返回-1
		查询人物学分:public double queryCHCredit() ,查询成功返回学分,失败返回-1
		查询人物综测:public double queryCHComprehensiveTest() ,查询成功返回综测,失败返回-1
		查询当前时间:public int queryCHCurrentTime() ,查询成功返回当前时间,失败返回-1
		查询当前第几周:public int queryCHCurrentWeek() ,查询成功返回当前第几周,失败返回-1
		更新人物活力值 public int updateCHCurrentEnergy(int CHCurrentEnergy) ,成功则返回更新记录的条数,失败返回值小于0
		更新人物活力上限 public int updateCHMaximumEnergy(int CHMaximumEnergy),成功则返回更新记录的条数,失败返回值小于0
		更新人物学分  public int updateCHCredit(double CHCredit),成功则返回更新记录的条数,失败返回值小于0
		更新人物综测  public int updateCHComprehensiveTest(double CHComprehensiveTest),成功则返回更新记录的条数,失败返回值小于0
		更新当前时间  public int updateCHCurrentTime(int CHCurrentTime),成功则返回更新记录的条数,失败返回值小于0
		更新当前周  public int updateCHCurrentWeek(int CHCurrentWeek),成功则返回更新记录的条数,失败返回值小于0

  我把这些接口函数都封装在 DatabaseManage 这个类中,调用这个类中的函数实现对数据库的操作:

public class DatabaseManage {

    private Database database;

    public DatabaseManage(Context context) {
        database = new Database(context);//继承自带的SQLiteOpenHelper类,建数据库
    }

    /************对 Character 表的操作***********************/
    //插入一条人物记录
    public long insertCharacter(Character character){
        SQLiteDatabase sQLiteDatabase = database.getReadableDatabase(); //以读写方式打开数据库
        Cursor cursor = sQLiteDatabase.query("Character",null,null,null,null,null,null);//查询并获得游标
        long results = 0;
        if( cursor.getCount() > 0 )  //已经注册过了
        {
            results = 0;
        }
        else
        {
            ContentValues values = new ContentValues();// 开始组装数据
            values.clear();
            values.put("CHid", character.CHid);
            values.put("CHName", character.CHName);
            values.put("CHNo", character.CHNo);
            values.put("CHClass", character.CHClass);
            values.put("CHImage", character.CHImage);
            values.put("CHCurrentEnergy", String.valueOf(character.CHCurrentEnergy) );
            values.put("CHMaximumEnergy", String.valueOf(character.CHMaximumEnergy) );
            values.put("CHCredit", String.valueOf(character.CHCredit) );
            values.put("CHComprehensiveTest", String.valueOf(character.CHComprehensiveTest) );
            values.put("CHCurrentTime", String.valueOf(character.CHCurrentTime));
            values.put("CHCurrentWeek", character.CHCurrentWeek);
            results = sQLiteDatabase.insert("Character", null, values);
        }
        sQLiteDatabase.close();
        return results;
    }
}

  因为我们做的是游戏,需要往数据库里插入将近千多条的数据,担心会花费太多时间,于是学习使用SQLiteStatement批量插入数据,但是最后发现速度上并没有提高多少

		Course[] course = new Course[8];
        course[0].setCourse(1, "高数", 8, 5, 0.09804);
        course[1].setCourse(2, "高级语言程序设计", 8, 4, 0.07843);
        course[2].setCourse(3, "计算机导论", 5, 1.5, 0.04412);
        course[3].setCourse(4, "线性代数", 6, 2, 0.05882);
        course[4].setCourse(5, "大学英语", 6, 2.5, 0.07353);
        course[5].setCourse(6, "思想道德修养与法律基础", 4, 2, 0.05882);
        course[6].setCourse(7, "体育", 5, 1, 0.05882);
        course[7].setCourse(8, "晚自习", 1, 1, 0.00952);
        String insertCouseSql = "insert into Course( Cid, CName, CEachClassEnergy, CCredit, CEachClassCredit) VALUES ( ?, ?, ?, ?, ?)";
        sQLiteDatabase.beginTransaction();
        SQLiteStatement sQLiteStatementinsertCouse = sQLiteDatabase.compileStatement(insertCouseSql);
        for (int i = 0; i < course.length ; i++) {
            sQLiteStatementinsertCouse.bindLong( 1, course[i].getCid());
            sQLiteStatementinsertCouse.bindString( 2, course[i].getCName());
            sQLiteStatementinsertCouse.bindString( 3, String.valueOf(course[i].getCEachClassEnergy()));
            sQLiteStatementinsertCouse.bindString( 4, String.valueOf(course[i].getCCredit()));
            sQLiteStatementinsertCouse.bindString( 5, String.valueOf(course[i].getCEachClassCredit()));
            sQLiteStatementinsertCouse.executeInsert();
            sQLiteStatementinsertCouse.clearBindings();
        }
       sQLiteDatabase.setTransactionSuccessful();
       sQLiteDatabase.endTransaction();

总结

  在开始这次团队项目之前没有学习过Android,连Java也是这学期才开始学的。所以在起初决定做app时还是挺有压力的,这次团队项目给我们的时间并不多,学习的时间也不长。从Android studio的安装开始就屡遇波折,Android studio的插件安装、genmotion模拟器无法开启虚拟机、adb调试时无法root模拟器、以及错误的调试,而且因为我没有提早完成接口文档,拖了团队进度。但是能利用这么短的时间,大家把团队项目给做出来还是非常满足的,所以就是一句话:不去尝试永远不知道自己做不做得到。

posted on 2017-11-09 23:53  yejifeng  阅读(231)  评论(1)    收藏  举报

导航