Android SQL

SQLite:

一、简介:

1. [访问应用内的数据]Android通过 SQLite 数据库引擎来实现结构化数据的存储。在一个数据库应用程序中,任何类都可以通过名字对已经创建的数据库进行访问,但是在应用程序之外就不可以。除非在sd卡中.

2. [小而快]SQLite 数据库是一种用C语言编写的嵌入式数据库,它是一个轻量级的数据库,最初为嵌入式设计的。它是在一些基础简单的语句处理上要比oracle / mysql快很多,而且其对内存的要求很低,在内存中只需要几百KB的存储空间。这是Android中采用 SQLite 数据库的主要原因。

3. SQLite 支持事务处理功能,Transaction

4. SQLite 处理速度比MySQL等著名的开源数据库系统更快;它没有服务器进程。 

5. [跨平台]SQLite 通过文件保存数据库,该文件是跨平台的,可以自由复制。一个文件就是一个数据库,数据库名即文件名。

[API]JDBC会消耗太多系统资源,所以JDBC对于手机并不合适,因此Android提供了新的API来使用 SQLite 数据库。

下面是数据库具体的实现:

第一步:创建SQLiteOpenHelper

package com.example.sqldatabasetextdemo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
	//数据库的版本
	private static final int DATABASE_VERSION = 1;
	//数据库的名称
	private static final String DATABASE_NAME = "my_update.db";
	//数据库的表名称【一张数据库可以有多张表】
	public static final String TABLE_STUDENT = "student";
	//数据库表的字段
	public static final String ID = "_id", NAME = "name", AGE = "age",
			SEX = "sex";
	public static final Uri STUDENT_URI = Uri.parse("content://"+"com.example.sqldatabasetextdemo/student");
	private static MySQLiteOpenHelper mSQL;
	public MySQLiteOpenHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}
	
	public static MySQLiteOpenHelper getInstance(Context context){
		if (mSQL == null) {
			synchronized (MySQLiteOpenHelper.class) {
				if (mSQL == null) {
					mSQL = new MySQLiteOpenHelper(context);
				}
			}
		}
		return mSQL;
	}
	
	private MySQLiteOpenHelper(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String strSQL = "CREATE TABLE IF NOT EXISTS " + TABLE_STUDENT + " ("
				+ ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME
				+ " VARCHAR(10), " + AGE + " VARCHAR(10), " + SEX
				+ " VARCHAR(10) " + ")";
		db.execSQL(strSQL);
	}

	//数据库升级回调的方法
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		String strSQL = "DROP TABLE IF EXISTS"+TABLE_STUDENT;
		if(newVersion > oldVersion){
			db.execSQL(strSQL);
			onCreate(db);
		}
	}
	
	//数据库降低版本回调的方法【注意:这个方法不重写回导致降低版本程序挂掉 super.onDowngrade(db, oldVersion, newVersion)该方法抛出了一个异常】
	@Override
	public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		String strSQL = "DROP TABLE IF EXISTS"+TABLE_STUDENT;
		if(newVersion > oldVersion){
			db.execSQL(strSQL);
			onCreate(db);
		}
	}
	
}
上面有几个坑一定要注意这个也是我在业务版本升级遇见的。

第二步:创建ContentProvider:

package com.example.sqldatabasetextdemo;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class MyProvider extends ContentProvider {
	private final static String TAG = MyProvider.class.getSimpleName();
	//授权填写的是包名【androidManifest 也要写这个属性也是包名】
	private final static String AUTHORITY = "com.example.sqldatabasetextdemo";
	//匹配Uri
	private static UriMatcher sUriMatcher;
	private MySQLiteOpenHelper mySqlOpenHelper;
	private static final int STUDENT = 1;
	
	//添加Uri到UriMatcher
	static{
		sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		sUriMatcher.addURI(AUTHORITY, MySQLiteOpenHelper.TABLE_STUDENT, STUDENT);
	}
	
	@Override
	public int delete(Uri uri, String whereClause, String[] whereArgs) {
		int rowNum = 0;
		SQLiteDatabase db = mySqlOpenHelper.getWritableDatabase();
		switch (sUriMatcher.match(uri)) {
		case STUDENT:
			rowNum = db.delete(MySQLiteOpenHelper.TABLE_STUDENT, whereClause, whereArgs);
			break;

		default:
			break;
		}
		return rowNum;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues contentValues) {
		SQLiteDatabase db = mySqlOpenHelper.getWritableDatabase();
		switch (sUriMatcher.match(uri)) {
		case STUDENT:
			db.insert(MySQLiteOpenHelper.TABLE_STUDENT, null, contentValues);
			break;

		default:
			break;
		}
		return null;
	}

	@Override
	public boolean onCreate() {
		mySqlOpenHelper = MySQLiteOpenHelper.getInstance(getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		Cursor cursor = null;
		SQLiteDatabase db = mySqlOpenHelper.getWritableDatabase();
		switch (sUriMatcher.match(uri)) {
		case STUDENT:
			cursor = db.query(MySQLiteOpenHelper.TABLE_STUDENT, projection, selection, selectionArgs, null, null, sortOrder);
			break;

		default:
			break;
		}
		return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) {
		int rownum = 0;
		SQLiteDatabase db= mySqlOpenHelper.getWritableDatabase();
		switch (sUriMatcher.match(uri)) {
		case STUDENT:
			rownum = db.update(MySQLiteOpenHelper.TABLE_STUDENT, contentValues, selection, selectionArgs);
			break;

		default:
			break;
		}
		return rownum;
	}

}
此时你基本配置一个AndroidManifest就可以操作数据库了:

 <provider
            android:name="com.example.sqldatabasetextdemo.MyProvider"
            android:authorities="com.example.sqldatabasetextdemo"
            />
数据库创建就是以上三步,很简单吧!

下面贴上我的测试代码:

package com.example.sqldatabasetextdemo;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
	private final Context mContext = this;
	
	private EditText name_editText;
	private EditText age_editText;
	private EditText sex_editText;
	private TextView mTextView;
	
	private String name;
	private String age;
	private String sex;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    private void initView(){
    	name_editText = (EditText)findViewById(R.id.name_editText);
    	age_editText = (EditText)findViewById(R.id.age_editText);
    	sex_editText = (EditText)findViewById(R.id.sex_editText);
    	mTextView = (TextView)findViewById(R.id.textView);
    }
    
    public void click(View view){
    	switch (view.getId()) {
    	//读取EditText中的内容存储于数据库中
		case R.id.button1:
		{
			name = name_editText.getText().toString();
			age = age_editText.getText().toString();
			sex = sex_editText.getText().toString();
			//类似与HashMap 一个储存类
			ContentValues values = new ContentValues();
			values.put(MySQLiteOpenHelper.NAME, name);
			values.put(MySQLiteOpenHelper.AGE, age);
			values.put(MySQLiteOpenHelper.SEX, sex);
			//插入数据库
			mContext.getContentResolver().insert(MySQLiteOpenHelper.STUDENT_URI, values);
			break;
		}
		//查询数据库中的内容
		case R.id.button2:
		{
			Cursor cursor = mContext.getContentResolver().query(MySQLiteOpenHelper.STUDENT_URI, null, null, null, null);
			if (cursor == null || cursor.getCount() <1) {
				return;
			}
			StringBuilder sb = new StringBuilder();
			while (cursor.moveToNext() ) {
				String name = cursor.getString(cursor.getColumnIndex(MySQLiteOpenHelper.NAME));
				String age = cursor.getString(cursor.getColumnIndex(MySQLiteOpenHelper.AGE));
				String sex = cursor.getString(cursor.getColumnIndex(MySQLiteOpenHelper.SEX));
				sb.append("name:"+name+",age:"+age+",sex:"+sex);
			}
			closeCursor(cursor);
			mTextView.setText(sb.toString());
			break;
		}
		//删除操作
		case R.id.delete_button:
		{
			//在项目中如果一个表中字段不是一样格式,建议如以下这么写,因为替换?这个有问题
			String strWhere = MySQLiteOpenHelper.ID+"= '1'";
			mContext.getContentResolver().delete(MySQLiteOpenHelper.STUDENT_URI,strWhere, null);
			break;
		}
		//更改操作
		case R.id.update_button:
		{
			ContentValues contextValues = new ContentValues();
			contextValues.put(MySQLiteOpenHelper.NAME, "王五");
			contextValues.put(MySQLiteOpenHelper.AGE, "13");
			contextValues.put(MySQLiteOpenHelper.SEX, "男");
			//在项目中如果一个表中字段不是一样格式,建议如以下这么写,因为替换?这个有问题
			String strWhere = MySQLiteOpenHelper.NAME+"= '张三'";
			mContext.getContentResolver().update(MySQLiteOpenHelper.STUDENT_URI, contextValues, strWhere, null);
			break;
		}
		default:
			break;
		}
    }
    
    private void closeCursor(Cursor cursor){
    	if (cursor != null && !cursor.isClosed()) {
			cursor.close();
			cursor = null;
		}
    }
    
}	
数据库简单使用上面这些操作应该对你会有帮助,后面我也会更新数据库监听者以及数据事务。希望我的博友一直关注下去,我会和你们一起成长努力!!!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以使用SQLite数据库来存储数据。要存储日期和时间类型的数据,可以使用SQLite中的DATETIME数据类型。 在SQLite中,DATETIME数据类型存储日期和时间信息,精确到秒级别。在Android中,可以使用以下格式的字符串来表示DATETIME类型的数据: YYYY-MM-DD HH:MM:SS 其中,YYYY表示年份,MM表示月份,DD表示日期,HH表示小时数(24小时制),MM表示分钟数,SS表示秒数。 在Android中,可以使用以下方法将字符串转换为Date类型: ```java String dateString = "2019-06-20 12:30:00"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = dateFormat.parse(dateString); ``` 同样地,也可以使用以下方法将Date类型转换为字符串: ```java SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = dateFormat.format(date); ``` 在使用SQLite数据库时,可以使用DATETIME类型的列来存储日期和时间信息。例如,可以使用以下代码创建一个包含DATETIME类型列的表: ```java db.execSQL("CREATE TABLE my_table (id INTEGER PRIMARY KEY, date_time DATETIME)"); ``` 然后,可以使用以下代码向表中插入数据: ```java String dateString = "2019-06-20 12:30:00"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = dateFormat.parse(dateString); ContentValues values = new ContentValues(); values.put("date_time", date.getTime()); db.insert("my_table", null, values); ``` 其中,date.getTime()返回的是Date类型对象的时间戳(以毫秒为单位)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值