ormLite 原生查询

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值