您的位置:首页 > 移动开发 > Android开发

如何自己在Android编写一个Sqlite动态操作软件

2015-12-11 17:46 771 查看

浏览前须知:

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
aeaa
{
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.csdn.net/detail/googol2002/9348041
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android sqlite