使用contentprovider实现的日记(转)

目录结构:

MyDiaryActivity.java

package com.zhang.myDiary;

import com.zhang.myDiary.DiaryColumn.DiaryClmn;

import android.app.Activity;
import android.app.ListActivity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MyDiaryActivity extends ListActivity {
	/** Called when the activity is first created. */

	public static final int MENU_ITEM_INSERT = Menu.FIRST;
	public static final int MENU_ITEM_EDIT = Menu.FIRST + 1;
	public static final int MENU_ITEM_DELETE = Menu.FIRST + 2;

	private static final String PROJECTION[] = new String[] { DiaryClmn._ID,
			DiaryClmn.TITLE, DiaryClmn.CREATED };

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		setTitle("wyl的diary");
		getWindow().setBackgroundDrawableResource(R.drawable.diarybg);

		Intent intent = getIntent();

		if (intent.getData() == null) {
			intent.setData(DiaryClmn.CONTENT_URI);

		}

		Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null,
				null, DiaryClmn.DEFAULT_SORT_ORDER);

		SimpleCursorAdapter adapter = new SimpleCursorAdapter(
				MyDiaryActivity.this, R.layout.mydiary_row, cursor,
				new String[] { DiaryClmn.TITLE, DiaryClmn.CREATED }, new int[] {
						R.id.text1, R.id.created });

		setListAdapter(adapter);
	}

	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(0, MENU_ITEM_INSERT, 0, R.string.menu_insert);
		menu.add(0, android.view.Menu.NONE, 1, R.string.menu_insert_2);
		return true;
	}

	public boolean onPrepareOptionsMenu(Menu menu) {

		super.onPrepareOptionsMenu(menu);

		final boolean haveItems = getListAdapter().getCount() > 0;

		if (haveItems) {
			if (getListView().getSelectedItemId() > 0) {
				menu.removeGroup(1);

				Uri uri = ContentUris.withAppendedId(getIntent().getData(),
						getListView().getSelectedItemId());

				Intent intent = new Intent(null, uri);

				menu.add(1, MENU_ITEM_EDIT, 1, "编辑内容").setIntent(intent);
				menu.add(1, MENU_ITEM_DELETE, 1, "删除当前日记");

			}
		} else {
			menu.removeGroup(1);
		}

		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		case MENU_ITEM_INSERT:

			Intent intent0 = new Intent(this, MyDiaryEdit.class);

			intent0.setAction(MyDiaryEdit.INSERT_TEXT_ACTION);
			intent0.setData(getIntent().getData());
			startActivity(intent0);
			return true;

		case MENU_ITEM_EDIT:

			Intent intent1 = new Intent(this, MyDiaryEdit.class);
			intent1.setAction(MyDiaryEdit.EDIT_TEXT_ACTION);
			intent1.setData(item.getIntent().getData());
			startActivity(intent1);
			return true;

		case MENU_ITEM_DELETE:
			Uri uri = ContentUris.withAppendedId(getIntent().getData(),
					getListView().getSelectedItemId());
			getContentResolver().delete(uri, null, null);
			rewindView();
		}

		return super.onOptionsItemSelected(item);
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub

		Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);

		startActivity(new Intent(MyDiaryEdit.EDIT_TEXT_ACTION, uri));

	}

	private void rewindView() {
		// TODO Auto-generated method stub
		Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null,
				null, DiaryClmn.DEFAULT_SORT_ORDER);

		SimpleCursorAdapter adapter = new SimpleCursorAdapter(
				MyDiaryActivity.this, R.layout.mydiary_row, cursor,
				new String[] { DiaryClmn.TITLE, DiaryClmn.CREATED }, new int[] {
						R.id.text1, R.id.created });

		setListAdapter(adapter);

	}
}

DiaryColumn.java

package com.zhang.myDiary;

import java.net.URI;

import android.net.Uri;
import android.provider.BaseColumns;
import android.text.StaticLayout;

public class DiaryColumn
{

	public static final String AUTHORITY = "com.zhang.myDiary.Myprovider";

	public DiaryColumn()
	{
	}

	public static final class DiaryClmn implements BaseColumns
	{

		private DiaryClmn(){};

		public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/diarias");

		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.diary";

		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.diary";

		public static final String DEFAULT_SORT_ORDER = "created DESC";

		public static final String TITLE = "title";

		public static final String BODY = "body";

		public static final String CREATED = "created";

	}
}

MyDiaryContentProvider.java

package com.zhang.myDiary;

import java.util.Calendar;
import java.util.HashMap;

import com.zhang.myDiary.DiaryColumn.DiaryClmn;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.widget.TextView;

public class MyDiaryContentProvider extends ContentProvider
{

	private static final String DATABASE_NAME = "Diarydatabase";
	private static final int DATABASE_VERSION = 1;
	private static final String DIARY_TABLE_NAME = "diary";

	private static final int DIARIES = 1;
	private static final int DIARY_ID = 2;

   private MyDiaryBaseHalper myDiaryBaseHalper;

	private Context context;

	private static  UriMatcher  sUriMatcher;
	private static HashMap<String,String>mHashMap;

	static{

		sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
		sUriMatcher.addURI(DiaryColumn.AUTHORITY,"diarias",DIARIES);
		sUriMatcher.addURI(DiaryColumn.AUTHORITY, "diarias/#",DIARY_ID);	

		mHashMap=new HashMap<String, String>();
		mHashMap.put(DiaryClmn._ID, DiaryClmn._ID);
		mHashMap.put(DiaryClmn.TITLE, DiaryClmn.TITLE);
		mHashMap.put(DiaryClmn.BODY,DiaryClmn.BODY);
		mHashMap.put(DiaryClmn.CREATED, DiaryClmn.CREATED);
	}

	public static class MyDiaryBaseHalper extends SQLiteOpenHelper{

		public MyDiaryBaseHalper(Context context, String name, CursorFactory factory, int version)
		{
			super(context, name, factory, version);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void onCreate(SQLiteDatabase db)
		{
			// TODO Auto-generated method stub

			String sql="CREATE TABLE diary("+DiaryClmn._ID+" INTEGER PRIMARY KEY,"+DiaryClmn.TITLE+"  TEXT,"+DiaryClmn.BODY+" TEXT,"+DiaryClmn.CREATED+"  TEXT"+");";

			db.execSQL(sql);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
		{
			// TODO Auto-generated method stub
			db.execSQL("DROP TABLE IF EXISTS diary");
			onCreate(db);
		}

	}

	@Override
	public boolean onCreate()
	{
		// TODO Auto-generated method stub
		myDiaryBaseHalper=new MyDiaryBaseHalper(getContext(), DATABASE_NAME, null,DATABASE_VERSION);
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
	{
		// TODO Auto-generated method stub
		SQLiteQueryBuilder dp=new SQLiteQueryBuilder();

		switch (sUriMatcher.match(uri))
		{
		case DIARIES :

			dp.setTables(DIARY_TABLE_NAME);
			dp.setProjectionMap(mHashMap);
			break;

		case DIARY_ID:
			dp.setTables(DIARY_TABLE_NAME);
			dp.setProjectionMap(mHashMap);
			dp.appendWhere(DiaryClmn._ID+"="+uri.getPathSegments().get(1));
			break;
		default:
			throw new IllegalArgumentException("错误 的uri:"+uri);
		}

		String olderBY;
		if (TextUtils.isEmpty(sortOrder))
		{
			olderBY=DiaryClmn.DEFAULT_SORT_ORDER;
		}else {
			olderBY=sortOrder;
		}

		SQLiteDatabase db=myDiaryBaseHalper.getReadableDatabase();

		Cursor cursor=dp.query(db, projection, selection, selectionArgs, null,null, olderBY);
		cursor.setNotificationUri(getContext().getContentResolver(), uri);
		return cursor;
	}

	@Override
	public String getType(Uri uri)
	{
		// TODO Auto-generated method stub
		switch (sUriMatcher.match(uri))
		{
		case DIARIES:

			return DiaryClmn.CONTENT_ITEM_TYPE;
		case DIARY_ID:

			return DiaryClmn.CONTENT_ITEM_TYPE;

		default:
			throw new IllegalArgumentException("Unknown URI " + uri);
		}

	}

	@Override
	public Uri insert(Uri uri, ContentValues values)
	{
		// TODO Auto-generated method stub
		SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase();

		long rwId=db.insert(DIARY_TABLE_NAME, DiaryClmn.BODY, values);

		if (rwId>0)
		{
			Uri rwIdUri=ContentUris.withAppendedId(DiaryClmn.CONTENT_URI, rwId);

			getContext().getContentResolver().notifyChange(rwIdUri,null);

			return rwIdUri;
		}
		throw new SQLException("Failed to insert row into " + uri);
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs)
	{
		// TODO Auto-generated method stub
		SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase();

		String rwId=uri.getPathSegments().get(1);

		return db.delete(DIARY_TABLE_NAME, selection+"="+rwId,null);
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
	{
		// TODO Auto-generated method stub

		SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase();

			String rwId=uri.getPathSegments().get(1);
			return db.update(DIARY_TABLE_NAME, values, DiaryClmn._ID+"="+rwId,null);

	}

	public static String getFormateCreatedDate() {
		Calendar calendar = Calendar.getInstance();
		String created = calendar.get(Calendar.YEAR) + "年"
				+ calendar.get(Calendar.MONTH) + "月"
				+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
				+ calendar.get(Calendar.HOUR_OF_DAY) + "时"
				+ calendar.get(Calendar.MINUTE) + "分";
		return created;
	}

}

MyDiaryEdit.java

package com.zhang.myDiary;

import com.zhang.myDiary.DiaryColumn.DiaryClmn;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;

import android.database.Cursor;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MyDiaryEdit extends Activity
{

	private static final String TAG = "Diary";
	public static final String EDIT_TEXT_ACTION="com.zhang.myDiary.MyDiaryEdit.EDIT_DIARY";
	public static final String INSERT_TEXT_ACTION="com.zhang.myDiary.MyDiaryEdit.action.INSERT_DIARY";

	private static final String []projection=new String[]{DiaryClmn._ID,DiaryClmn.TITLE,DiaryClmn.BODY};

	private static final int STATE_EDIT = 0;
	private static final int STATE_INSERT = 1;

	private int mState;

	private Uri mUri;
	private Cursor mCursor;

	private EditText mTitleText;
	private EditText mBodyText;
	private Button confirmButton,modifyButton;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setTheme(android.R.style.Theme_Black);

		final Intent intent=getIntent();

		final String  action=intent.getAction();
		setContentView(R.layout.mydiaryedit);
		mTitleText=(EditText)findViewById(R.id.title);
		mBodyText=(EditText)findViewById(R.id.body);

		confirmButton=(Button)findViewById(R.id.confirm);
		modifyButton=(Button)findViewById(R.id.modified);

		if (EDIT_TEXT_ACTION.equals(action))
		{
			mState=STATE_EDIT;
			mTitleText.setEnabled(false);
			mBodyText.setEnabled(false);
			modifyButton.setVisibility(View.VISIBLE);
			mUri=intent.getData();
			mCursor=managedQuery(mUri, projection, null, null,null);
			mCursor.moveToFirst();
			String title=mCursor.getString(1);
			mTitleText.setTextKeepState(title);
			String body=mCursor.getString(2);
			mBodyText.setTextKeepState(body);

			setResult(RESULT_OK, new Intent(MyDiaryEdit.EDIT_TEXT_ACTION, mUri));
			setTitle("编辑日记");
		}else if (INSERT_TEXT_ACTION.equals(action))
		{
			mState = STATE_INSERT;
			setTitle("新建日记");
		}else {

		Log.e(TAG, "no such action error");
		MyDiaryEdit.this.finish();

			return ;
		}

		confirmButton.setOnClickListener(new MyBtnOnClickListen());
		modifyButton.setOnClickListener(new MyBtnOnClickListen());

	}
	private class MyBtnOnClickListen implements Button.OnClickListener{

		@Override
		public void onClick(View v)
		{
			// TODO Auto-generated method stub
			switch (v.getId())
			{
			case R.id.confirm:

				if (mState==STATE_INSERT)
				{
					insertDiary();

				}else {

					//mTitleText.setEnabled(true);
					//mBodyText.setEnabled(true);
					updataDiary();
				}
				Intent intent=new Intent();
				setResult(RESULT_OK, intent);
				finish();

				break;

			case R.id.modified:
				mTitleText.setEnabled(true);
				mBodyText.setEnabled(true);
				break;
			}
		}

		private void insertDiary()
		{
			// TODO Auto-generated method stub
			ContentValues values=new ContentValues();

			String title=mTitleText.getText().toString();
			String body=mBodyText.getText().toString();

			values.put(DiaryClmn.CREATED,MyDiaryContentProvider.getFormateCreatedDate());
			values.put(DiaryClmn.TITLE,title);
			values.put(DiaryClmn.BODY,body);

			getContentResolver().insert(DiaryClmn.CONTENT_URI, values);

		}

		private void updataDiary()
		{
			// TODO Auto-generated method stub
			ContentValues values=new ContentValues();

			String title=mTitleText.getText().toString();
			String body=mBodyText.getText().toString();

			values.put(DiaryClmn.CREATED,MyDiaryContentProvider.getFormateCreatedDate());
			values.put(DiaryClmn.TITLE, title);
			values.put(DiaryClmn.BODY, body);
			getContentResolver().update(mUri, values, null,null);

		}

	}
}

main.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:layout_gravity="center_vertical"
 6     android:orientation="vertical" >
 7
 8     <ListView
 9         android:id="@+id/android:list"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:smoothScrollbar="true" />
13
14     <TextView
15         android:id="@+id/android:empty"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:textColor="#000000"
19         android:textStyle="bold"
20         android:text="您还没有开始写日记呢!点击下边的Menu按钮开始写日记吧:)" />
21
22 </LinearLayout>

mydiary_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="30px"
        android:layout_marginTop="10dip"
        android:maxWidth="200dip"
        android:text="第一组第一项"
        android:textColor="#000000"
        android:textSize="22sp" />

    <TextView
        android:id="@+id/created"
        android:layout_width="wrap_content"
        android:layout_height="35px"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="10dip"
        android:layout_marginTop="10dip"
        android:text="2012年4月2号"
        android:textColor="#000000" />

</RelativeLayout>

mydiaryedit.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="0dip"
        android:layout_height="0dip"
        android:focusable="true"
        android:focusableInTouchMode="true" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="2px"
            android:text="@string/title" />

        <EditText
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#000000" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/body" />

        <EditText
            android:id="@+id/body"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"

            android:singleLine="false"
            android:textColor="#000000" />

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/modified"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:text="click me!编辑"
                android:visibility="invisible" >
            </Button>

            <Button
                android:id="@+id/confirm"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignTop="@+id/modified"
                android:text="   确定     " />
        </RelativeLayout>
    </LinearLayout>

</LinearLayout>

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="0dip"
        android:layout_height="0dip"
        android:focusable="true"
        android:focusableInTouchMode="true" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="2px"
            android:text="@string/title" />

        <EditText
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#000000" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/body" />

        <EditText
            android:id="@+id/body"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"

            android:singleLine="false"
            android:textColor="#000000" />

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/modified"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:text="click me!编辑"
                android:visibility="invisible" >
            </Button>

            <Button
                android:id="@+id/confirm"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignTop="@+id/modified"
                android:text="   确定     " />
        </RelativeLayout>
    </LinearLayout>

</LinearLayout>

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zhang.myDiary"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <provider
            android:name="MyDiaryContentProvider"
            android:authorities="com.zhang.myDiary.Myprovider" />

        <activity
            android:name=".MyDiaryActivity"
           >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.zhang.myDiary.MyDiaryEdit"
            android:label="@string/title_diary"
            android:theme="@android:style/Theme.Light" >
            <intent-filter>
                <action android:name="com.zhang.myDiary.MyDiaryEdit.EDIT_DIARY" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="vnd.android.cursor.item/vnd.google.diary"/>
            </intent-filter>
            <intent-filter>
                <action android:name="com.zhang.myDiary.MyDiaryEdit.action.INSERT_DIARY" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="vnd.android.cursor.dir/vnd.google.diary" />
            </intent-filter>
        </activity>
    </application>

</manifest>
时间: 2024-08-08 01:28:03

使用contentprovider实现的日记(转)的相关文章

【Android的从零单排开发日记】——Android四大组件之ContentProvider

数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等).如果把第三方应用比作一个黑盒子的话,ContentProvider就像是从里面延伸出来的管道,从这个管道,应用可以把一些数据共享出来,我们也可以往里面输送数据.但是里面怎么处理数据我们看不到,也管不着.并且这个管道是有规范标准的,不是它规定的数据你塞不进

【Android的从零单排开发日记】之入门篇(九)——Android四大组件之ContentProvider

数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等).如果把第三方应用比作一个黑盒子的话,ContentProvider就像是从里面延伸出来的管道,从这个管道,应用可以把一些数据共享出来,我们也可以往里面输送数据.但是里面怎么处理数据我们看不到,也管不着.并且这个管道是有规范标准的,不是它规定的数据你塞不进

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S

【Android的从零单排开发日记】之入门篇(七)——Android数据存储(上)

在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Android的数据存储是构建在Linux的文件系统上,它充分利用Linux的账号系统来限定应用对数据的访问,部署了一套安全和灵活并重的数据存储解决方案.Android的文件框架,以及各种数据

小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相信] 一个端口就是一个潜在的通信通道,也就是一个入侵通道.对目标计算机进行端口扫描,能得到许多有用的信息.进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行扫描.在手工进行扫描时,需要熟悉各种命令.对命令执行后的输出进行分析.用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能.通过

小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议,arp协议属于二层协议,它是基于广播的,所以不可路由.而ICMP协议是可以路由的,理论上可以使用icmp协议发现全球的ip,如果没有边界防火墙(禁止icmp的探测包)进行过滤的话,对目标主机进行扫描,则会收到相应的响应,从而进行捕捉[有边界防火墙的现象比较普遍],但是三层发现的扫描速度也较二层要慢

四大组件之ContentProvider小结

总结提高,与君共勉 1.什么是Content Provider Content Provider维护特定的应用数据,并可以让其它应用轻松访问该数据.对数据使用者来说它是数据提供者.它提供统一的接口对数据进行操作,使用者不用关心数据到底是如何存储的以及数据类型到底是什么.也就是说,Content Provider作为数据提供者,提供了对外共享本地数据一种机制,使Android应用能方便地基于该机制进行数据访问.为了便于管理和访问,每个Content Provider必须有唯一标示,用Uri表示.U

ContentProvider

android使用一种称为contentprovider的概念来将数据抽象为服务. 这种内容提供给程序的理念看起来像是启用了REST的数据提供程序.REST(REpresentational State Transfer具象状态传输),它是一种设计风格,通常基于使用HTTP,URI和XML以及HTML这些现有的广泛流行的协议和标准.资源由URI指定,对资源的操作包括获取,创建,修改和删除资源:这些操作正好对应HTTP协议提供的GET,POST和DELETE方法. 要从ContentProvide

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和