研究了好几天,一直在找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 其实是差不多的; 努力啃吧,广度&深度有时候也是既相互独立又相互依赖,自己先在其中乐呵乐呵吧。