浏览前须知:
1.浏览此文章需要一定的Android基础和SQL语言基础
2.如果想要查看我上传的源码,请使用Android Studio。顺便说一句,还在用Eclipse开发Android的童鞋们快用AS吧,模拟器速度快,而且Google快要不更新支持Eclipse的SDK了。
3.这是一个综合性案例,我会找出一些一般老师不会讲到的API出来说一说
基础知识
会Android端Sqlite基础操作的跳过
1.如何打开一个数据库(如果没有被创建则创建)
package com.example.solomon.sqlitemanager.model;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Solomon on 2015/11/28.
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
sqlDb = new MySQLiteOpenHelper(this, (String)list.get(0), null, 1).getReadableDatabase();
数据库的操作可以通过sqlDb这个对象操作
正文
这个应用我采用的是MVC的设计模式,View是Android的界面,我将View得到的Sql语句抛给Controller,由Controller负责调用Model,来进行数据库操作。
因为SQL语句不同,例如SELECT语句一定有返回值,而INSERT,UPDATE,DELETE 却不需要和SQLITE自带的以.需要开头的语句,所以说需要对于不同的语句进行识别:
if (sql.startsWith(".")){
}else if (buffer.startsWith("SELECT")){
}else{
}
不需要返回的语句其实并没有什么可说的,只要是会一些Android 端SQLite查询的人都知道,但是动态的Sql语句查询是很多老师不会讲的,因为大多数的程序员写的表他们都知道哪个列名对应哪个类型。但是既然是一个Sqlite操作软件,执行Sql语句,我们是不可能去限定用户的输入类型的,因此我们需要自己去判断列的类型。
万幸的是,Android 为我们提供了API,如何判断代码如下:
private static List<List<String>> selelctSQL (SQLiteDatabase sqlDB, String sql){
Cursor cursor = sqlDB.rawQuery(sql, null);
List<List<String>> lists = new ArrayList<List<String>>();
List<String> element;
element = new ArrayList<String>();
for (int i = 0; i < cursor.getColumnCount(); i++){
element.add(cursor.getColumnName(i));
}
lists.add(element);
for (int pos = 0; cursor.moveToNext(); pos++){
element = new ArrayList<String>();
for (int i = 0; i < cursor.getColumnCount(); i++) {
int type = cursor.getType(i);
switch (type) {
case Cursor.FIELD_TYPE_INTEGER:
element.add("" + cursor.getInt(i));
break;
case Cursor.FIELD_TYPE_FLOAT:
element.add("" + cursor.getFloat(i));
break;
case Cursor.FIELD_TYPE_STRING:
element.add(cursor.getString(i));
break;
case Cursor.FIELD_TYPE_BLOB:
element.add("暂不支持");
break;
case Cursor.FIELD_TYPE_NULL:
element.add("NULL");
break;
default:
element.add("无法获取");
break;
}
}
lists.add(element);
}
return lists;
}
关于如何实现返回值的表格,我使用的是TableLayout加上ScrollView和HorizontalScrollView,使用代码动态添加TableRow。
Layout文件
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableLayout
android:id="@+id/result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</TableLayout>
</HorizontalScrollView>
</ScrollView>
动态添加TableRow
package com.example.solomon.sqlitemanager.view;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import com.example.solomon.sqlitemanager.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Solomon on 2015/12/5.
*/
public class ResultActivity extends Activity{
final static int [] colors = {0xFFFFFFFF,0xB0E0E6};
TableLayout result;
ResultData resultData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
result = (TableLayout) findViewById(R.id.result);
resultData = getIntent().getExtras().getParcelable("resultdata");
this.initResult(result, resultData.getLists());
}
private void initResult (TableLayout tableLayout, List<List<String>> lists){
TableRow tableRow;
tableRow = new TableRow(this);
for (List<String> list : lists){
tableRow = new TableRow(this);
this.initResultRow(tableRow, list);
tableLayout.addView(tableRow, new TableLayout.LayoutParams());
}
}
private void initResultRow (TableRow tableRow, List<String> data){
TextView tv;
for (int i = 0; i < data.size(); i++){
tv = new TextView(this);
tv.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1));
tv.setText(data.get(i));
tv.setBackgroundColor(colors[i % 2]);
tv.setPadding(3, 0, 3, 3);
tableRow.addView(tv);
}
}
}
package com.example.solomon.sqlitemanager.view;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
/**
* Created by Solomon on 2015/12/5.
*/
public class ResultData implements Parcelable {
private List<List<String>> lists;
public ResultData(List<List<String>> lists) {
this.lists = lists;
}
protected ResultData(Parcel in) {
//in.readList(lists, ClassLoader.getSystemClassLoader());
this.lists = in.readArrayList(null);
}
public static final Creator<ResultData> CREATOR = new Creator<ResultData>() {
@Override
public ResultData createFromParcel(Parcel in) {
return new ResultData(in);
}
@Override
public ResultData[] newArray(int size) {
return null;
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeList(lists);
}
public List<List<String>> getLists() {
return lists;
}
public void setLists(List<List<String>> lists) {
this.lists = lists;
}
}
那么大概如果读者看完了这段文字,就可以自己独立编写出一个自己的Sqlite动态操作软件了。
你也可以下载一下我的项目,自己去看http://download.youkuaiyun.com/detail/googol2002/9348041