如何自己在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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories