研究了好几天,一直在找SQLite优化方案,找到了几个框架,顺带研究下怎么在现有的基础上用框架;到现在为止,每做一步都要小心,因为对程序进行整改、完善的前提是要保证能正确运行!正确第一,性能第二!
关于SQLite的框架,对比了下: GreenDao androrm ormLite DataFramework Afinal;可以Google输入关键字来查阅详细内容;
其中我涉及过3个-greendao ormlite afinal ,greendao的依赖性挺高,从存储到查询都有一定的耦合性,故没采用;相反,ormlite比较便捷,而且功能项也比较强大,支持各类查询,挺全乎,而且锻炼自己英文阅读能力的时候到了,所有的精华钧在文档!!! afinal接触的时间也不短了,没用过数据库方面的操作;
好,那接下来就好好探究下ormlite吧;其实这个代码在我的另一博客体现过,但是现在的查询方式变了,侧重点在查询上面,不用Android原生封装的SQLiteHelper;
首先我们要做些准备工作:
1.准备数据库文件(此处为了方便,直接导入已有的数据库文件,就不用代码插值了)
2.准备jar包2个:http://ormlite.com/releases/ 下载core+Android包2个;
3.建立ormliteDBHelper,实际上就相当于Android封装的SQLiteDBHelper一样;只是前者依赖jar包;
4.实体类(要对类、字段本身加特定注解,操作需要,见下文)
5.刻意去搜寻在框架之上拼凑原生的sql来查询的方法,网上的资料大都是一些通俗的写法,没有一些真正查API文档来实现的,那我就顶着压力看了大半天的原生态文档,尝试着倒腾出来的方法, 见文档:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Class-Setup
其实效果图还是之前那个,只是换了换查询方式! 查询途径更贴切吧;
上代码···············
1.帮助类---OrmliteDBHelper
package com.example.test_sqlite;
import java.sql.SQLException;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.example.test_sqlite.entity.MainData;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
public class OrmliteDBHelper extends OrmLiteSqliteOpenHelper {
private static final String SQL_NAME = "/sdcard/testDBinSD.sqlite";//数据库名称
private static final int DATABASE_VERSION = 1;
private Dao<MainData, Integer> mainDataDao = null;
public OrmliteDBHelper(Context context) {
super(context, SQL_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
try {
//建立映射。
TableUtils.createTable(connectionSource, MainData.class);
} catch (SQLException e) {
Log.e(OrmliteDBHelper.class.getName(), "创建数据库失败", e);
e.printStackTrace();
}
}
@Override
public void close() {
super.close();
mainDataDao = null;
}
//获取操作数据库表的句柄。
public Dao<MainData, Integer> getMainDataDao() throws SQLException {
if(mainDataDao == null) {
mainDataDao = getDao(MainData.class);
}
return mainDataDao;
}
@Override
public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,int arg3) {
// TODO Auto-generated method stub
}
}
2. 实体类--MainData
package com.example.test_sqlite.entity;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
/**
* 数据实体类
* 一定要注意类名、字段名都要加注解,映射的时候才能查到数据
* 如果未注解,查而无果;
* @author 24K
*
*/
@DatabaseTable(tableName = "maindata")
public class MainData {
@DatabaseField
private String id;
@DatabaseField
private String name;
@DatabaseField
private String sex;
@DatabaseField
private String grade;
public MainData() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
3.具体实现类--
package com.example.test_sqlite;
import java.sql.SQLException;
import java.util.List;
import com.example.test_sqlite.entity.MainData;
import com.example.test_sqlite.util.UnzipFileUtil;
import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.dao.GenericRawResults;
import com.j256.ormlite.support.ConnectionSource;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;
public class MainActivity extends Activity implements OnClickListener {
private MyDBHelper dbHelper;//SQLite帮助类
private OrmliteDBHelper ormDBHelper;//ormlite查询
Dao<MainData, Integer> helloDao;//查询句柄
private EditText input;
private EditText inputDetail;
private Button addBtn;
private EditText showContent;
//最主要功能是下面的俩=== 点击查询--数据呈现。
private Button searchBtn;
private TextView showText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDBHelper(this);//传统db查询。
ormDBHelper = new OrmliteDBHelper(this);
input = (EditText) findViewById(R.id.input);
inputDetail = (EditText) findViewById(R.id.input_detail);
addBtn = (Button) findViewById(R.id.addBtn);
showContent = (EditText) findViewById(R.id.showContext);
searchBtn = (Button) findViewById(R.id.searchBtn);
showText = (TextView) findViewById(R.id.show_textview);
addBtn.setOnClickListener(this);
searchBtn.setOnClickListener(this);
findViewById(R.id.unzip_button).setOnClickListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (ormDBHelper != null) {
OpenHelperManager.releaseHelper();
ormDBHelper = null;
}
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.addBtn) {
// handleInsertDB();
} else if(v.getId() == R.id.searchBtn) {
// handleSearchDB();
//用ormlite框架来查询sql
getMainDataByOrm();
} else if(v.getId() == R.id.unzip_button) {
handleUnzipFile();
}
}
//处理解压缩
private void handleUnzipFile() {
String targetPath = "mnt/sdcard/";
String zipFilePath = "mnt/sdcard/kpi_pic.zip";
// UnzipFileUtil.unZipFile(targetPath, zipFilePath);
UnzipFileUtil.Unzip(zipFilePath, targetPath);
// new Thread() {
// public void run() {
// String targetPath = "/sdcard/kpi_pic";
// String zipFilePath = "/sdcard/kpi_pic.zip";
// UnzipFileUtil.unZipFile(targetPath, zipFilePath);
// };}.start();
}
private void handleSearchDB() {
//查询sql。返回记录集合。
List<MainData> dataList = dbHelper.getMainData();
showDataInTextView(dataList);
}
public void showDataInTextView(List<MainData> dataList) {
StringBuilder sb = new StringBuilder();
for(MainData data : dataList) {
sb.append(data.getId()).append("-").//循环将记录拼接起来方便显示。
append(data.getName()).append("-").append(data.getSex()).
append("-").append(data.getGrade()).append("-\n").toString();
}
showText.setText(sb);//显示结果。
}
private OrmliteDBHelper getHelper() {
if (ormDBHelper == null) {
ormDBHelper = OpenHelperManager.getHelper(this, OrmliteDBHelper.class);
}
return ormDBHelper;
}
private void getMainDataByOrm() {
try {
//用ormlite来查sql
getDataByOrmLite();
// showDataInTextView(maindataList);
} catch (Exception e) {
e.printStackTrace();
}
}
public void getDataByOrmLite() throws SQLException {
StringBuilder sb = new StringBuilder();
//初始化查询句柄,方便查询数据库表。
helloDao = this.getHelper().getMainDataDao();
// List<MainData> maindataList = helloDao.queryForAll();
GenericRawResults<String[]> rawResults =
helloDao.queryRaw("select * from maindata where id = 2");
//拿出其中的结果
List<String[]> results = rawResults.getResults();
//循环遍历其中的所有字段,逐一取出。
for(int k = 0; k < results.size(); k++) {
for(int n = 0; n < results.get(k).length; n++) {
sb.append(results.get(k)[n]).append("-");
}
sb.append("\n");
}
// String []resultArray = results.get(0);
// for(int n = 0; n < resultArray.length; n++) {
// sb.append(resultArray[n]).append("-").append("\n");
// }
showText.setText(sb);//显示结果。
}
}
其实最关键的是最后的查询函数,getDataByOrmLite(),内部有好多方法可以查sql,要具体的查下API文档,http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Class-Setup
其中写这个查询费了自己不少的功夫,毕竟是从文档中查出来,综合自己的具体文件写出来的,通用性比较强;就像返回一个cursor一样方便;遍历就是了;
题外话: 今天给跟客户经理聊了会儿天,感觉不同层面的人视角的确不同;前3年你it进步的速度决定你未来it生涯的高度! 所以说刚入行的前3年抓紧时间充电极为重要,这个黄金时段对一个人的耐性、抗压性、预警能力、解决问题的决心、自我能力的提升是一个至关重要的环节!经历过苦思冥想、焦头烂额、通宵达旦、为解决问题尝试过十几种方案,问题顺利攻破的那一刻才能体会到挑战的喜悦,真正领悟到攻克难关的豪情;这不是任何人都能达到的境地!
凭借自己广泛的涉猎,其实对语言层面了解的一般化了,但是可能有个对比落差, 精其一,博览群书不如一技炉火纯青;不过时间还有,后续还要继续努力;Java-Android; c/c++ OC linux 其实是差不多的; 努力啃吧,广度&深度有时候也是既相互独立又相互依赖,自己先在其中乐呵乐呵吧。