
2、主要设计步骤
(1)添加引用
鼠标右击【引用】à【添加引用】,在弹出的窗口中勾选“System.Data”和“System.Data.SQlite”,如下图所示:

注意:不需要通过NuGet添加SQLite程序包,只需要按这种方式添加即可。
(2)添加图片
到Android SDK API 23的Samples的NotePad例子下找到app_notes.png,将其添加到该项目中,并将其换名为ch12_app_notes.png。
(3)添加ch1205_NoteEditor.axml文件
<?xml version="1.0" encoding="utf-8"?><view xmlns:android="http://schemas.android.com/apk/res/android"class="MyDemos.SrcDemos.ch1205LinedEditText"android:id="@+id/note"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="5dip"android:scrollbars="vertical"android:fadingEdge="vertical"android:gravity="top"android:textSize="22sp"android:capitalize="sentences" />(4)添加ch1205_Main.axml文件
<?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="wrap_content"android:orientation="horizontal"android:background="#ffffff"android:padding="10px"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ch12_app_notes" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="6px"><TextViewandroid:id="@+id/body"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/modified"android:layout_width="wrap_content"android:layout_height="wrap_content" /> </LinearLayout></LinearLayout>(5)添加ch1205Note.cs文件
using System;namespace MyDemos.SrcDemos{class ch1205Note : Java.Lang.Object{public long Id { get; set; }public string Body { get; set; }public DateTime ModifiedTime { get; set; }public ch1205Note(){Id = -1L;Body = string.Empty;}public ch1205Note(long id, string body, DateTime modified){Id = id;Body = body;ModifiedTime = modified;}public override string ToString(){return ModifiedTime.ToString();}}} (6)添加ch1205LinedEditText.cs文件 using Android.Content;using Android.Runtime;using Android.Widget;using Android.Graphics;using Android.Util;namespace MyDemos.SrcDemos{[Register("MyDemos.SrcDemos.ch1205LinedEditText")]class ch1205LinedEditText : EditText{private Rect rect;private Paint paint;// 为了LayoutInflater需要提供此构造函数public ch1205LinedEditText(Context context, IAttributeSet attrs): base(context, attrs){rect = new Rect();paint = new Paint();paint.SetStyle(Android.Graphics.Paint.Style.Stroke);paint.Color = Color.LightGray;}protected override void OnDraw(Canvas canvas){int count = LineCount;for (int i = 0; i < count; i++){int baseline = GetLineBounds(i, rect);canvas.DrawLine(rect.Left, baseline + 1, rect.Right, baseline + 1, paint);}base.OnDraw(canvas);}}}(7)添加ch1205NoteRepository.cs文件 using System;using System.Collections.Generic;using Mono.Data.Sqlite;namespace MyDemos.SrcDemos{class ch1205NoteRepository{private static string db_file = "notes.db3";private static SqliteConnection GetConnection(){var dbPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), db_file);bool exists = System.IO.File.Exists(dbPath);if (!exists) SqliteConnection.CreateFile(dbPath);var conn = new SqliteConnection("Data Source=" + dbPath);if (!exists) CreateDatabase(conn);return conn;}private static void CreateDatabase(SqliteConnection connection){var sql = "CREATE TABLE ITEMS (Id INTEGER PRIMARY KEY AUTOINCREMENT, Body ntext, Modified datetime);";connection.Open();using (var cmd = connection.CreateCommand()){cmd.CommandText = sql;cmd.ExecuteNonQuery();}// Create a sample note to get the user startedsql = "INSERT INTO ITEMS (Body, Modified) VALUES (@Body, @Modified);";using (var cmd = connection.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddWithValue("@Body", "今天有个约会");cmd.Parameters.AddWithValue("@Modified", DateTime.Now);cmd.ExecuteNonQuery();}connection.Close();}public static IEnumerable<ch1205Note> GetAllNotes(){var sql = "SELECT * FROM ITEMS;";using (var conn = GetConnection()){conn.Open();using (var cmd = conn.CreateCommand()){cmd.CommandText = sql;using (var reader = cmd.ExecuteReader()){while (reader.Read()){yield return new ch1205Note(reader.GetInt32(0),reader.GetString(1),reader.GetDateTime(2));}}}}}public static ch1205Note GetNote(long id){var sql = "SELECT * FROM ITEMS WHERE Id = id;";using (var conn = GetConnection()){conn.Open();using (var cmd = conn.CreateCommand()){cmd.CommandText = sql;using (var reader = cmd.ExecuteReader()){if (reader.Read())return new ch1205Note(reader.GetInt32(0), reader.GetString(1), reader.GetDateTime(2));elsereturn null;}}}}public static void DeleteNote(ch1205Note note){var sql = string.Format("DELETE FROM ITEMS WHERE Id = {0};", note.Id);using (var conn = GetConnection()){conn.Open();using (var cmd = conn.CreateCommand()){cmd.CommandText = sql;cmd.ExecuteNonQuery();}}}public static void SaveNote(ch1205Note note){using (var conn = GetConnection()){conn.Open();using (var cmd = conn.CreateCommand()){if (note.Id < 0){// Do an insertcmd.CommandText = "INSERT INTO ITEMS (Body, Modified) VALUES (@Body, @Modified); SELECT last_insert_rowid();";cmd.Parameters.AddWithValue("@Body", note.Body);cmd.Parameters.AddWithValue("@Modified", DateTime.Now);note.Id = (long)cmd.ExecuteScalar();}else{// Do an updatecmd.CommandText = "UPDATE ITEMS SET Body = @Body, Modified = @Modified WHERE Id = @Id";cmd.Parameters.AddWithValue("@Id", note.Id);cmd.Parameters.AddWithValue("@Body", note.Body);cmd.Parameters.AddWithValue("@Modified", DateTime.Now);cmd.ExecuteNonQuery();}}}}}} (8)添加ch1205NoteAdapter.cs文件 using Android.App;using Android.Content;using Android.Widget;namespace MyDemos.SrcDemos{class ch1205NoteAdapter : ArrayAdapter{private Activity activity;public ch1205NoteAdapter(Activity activity, Context context, int textViewResourceId, ch1205Note[] objects): base(context, textViewResourceId, objects){this.activity = activity;}public override Android.Views.View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent){//Get our object for this positionvar item = (ch1205Note)GetItem(position);// 如果convertView不为null则重用它,否则从当前布局中填充(inflate)它。// 由于这种方式不是每次都填充一个新的view,因此可提高性能。var view = (convertView ?? activity.LayoutInflater.Inflate(Resource.Layout.ch1205_Main, parent, false)) as LinearLayout;view.FindViewById<TextView>(Resource.Id.body).Text = Left(item.Body.Replace("
", " "), 25);view.FindViewById<TextView>(Resource.Id.modified).Text = item.ModifiedTime.ToString();return view;}private string Left(string text, int length){if (text.Length <= length) return text;return text.Substring(0, length);}}} (9)添加ch1205NoteEditorActivity.cs文件 using Android.App;using Android.Content;using Android.OS;using Android.Widget;using Android.Content.PM;namespace MyDemos.SrcDemos{[Activity(Label = "ch1205NoteEditorActivity", ScreenOrientation = ScreenOrientation.Sensor,ConfigurationChanges = ConfigChanges.KeyboardHidden | ConfigChanges.Orientation)]public class ch1205NoteEditorActivity : Activity{private ch1205Note note;private EditText text_view;protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);SetContentView(Resource.Layout.ch1205_NoteEditor);text_view = FindViewById<EditText>(Resource.Id.note);var note_id = Intent.GetLongExtra("note_id", -1L);if (note_id < 0) note = new ch1205Note();else note = ch1205NoteRepository.GetNote(note_id);}protected override void OnResume(){base.OnResume();text_view.SetTextKeepState(note.Body);}protected override void OnPause(){base.OnPause();// 如果是新建的记事本且没有内容,不保存直接返回。if (IsFinishing && note.Id == -1 && text_view.Text.Length == 0)return;// 保存记事本note.Body = text_view.Text;ch1205NoteRepository.SaveNote(note);}}}(10)添加ch1205NotePadMain.cs文件 using System.Linq;using Android.App;using Android.Content;using Android.OS;using Android.Views;using Android.Widget;namespace MyDemos.SrcDemos{[Activity(Label = "ch1205NotePadMain")]public class ch1205NotePadMain : ListActivity{// 菜单项public const int MenuItemDelete = Menu.First;public const int MenuItemInsert = Menu.First + 1;protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);SetDefaultKeyMode(DefaultKey.Shortcut);ListView.SetOnCreateContextMenuListener(this);PopulateList();}public void PopulateList(){// 获取存放到列表中的所有记事本项var notes = ch1205NoteRepository.GetAllNotes();var adapter = new ch1205NoteAdapter(this, this, Resource.Layout.ch1205_Main, notes.ToArray());ListAdapter = adapter;}public override bool OnCreateOptionsMenu(IMenu menu){base.OnCreateOptionsMenu(menu);menu.Add(0, MenuItemInsert, 0, "添加").SetShortcut("3", "a").SetIcon(Android.Resource.Drawable.IcMenuAdd);return true;}public override bool OnOptionsItemSelected(IMenuItem item){switch (item.ItemId){case MenuItemInsert: // 通过intent添加新项var intent = new Intent(this, typeof(ch1205NoteEditorActivity));intent.PutExtra("note_id", -1L);StartActivityForResult(intent, 0);return true;}return base.OnOptionsItemSelected(item);}public override void OnCreateContextMenu(IContextMenu menu, View view, IContextMenuContextMenuInfo menuInfo){var info = (AdapterView.AdapterContextMenuInfo)menuInfo;var note = (ch1205Note)ListAdapter.GetItem(info.Position);menu.Add(0, MenuItemDelete, 0, "删除");}public override bool OnContextItemSelected(IMenuItem item){var info = (AdapterView.AdapterContextMenuInfo)item.MenuInfo;var note = (ch1205Note)ListAdapter.GetItem(info.Position);switch (item.ItemId){case MenuItemDelete: // 删除该记事本项ch1205NoteRepository.DeleteNote(note);PopulateList();return true;}return false;}protected override void OnListItemClick(ListView l, View v, int position, long id){var selected = (ch1205Note)ListAdapter.GetItem(position);// 执行activity,查看/编辑当前选中的项var intent = new Intent(this, typeof(ch1205NoteEditorActivity));intent.PutExtra("note_id", selected.Id);StartActivityForResult(intent, 0);}protected override void OnActivityResult(int requestCode, Result resultCode, Intent data){base.OnActivityResult(requestCode, resultCode, data);// 当列表项发生变化时,这里仅关心如何刷新它,并没有处理选定的项PopulateList();}}}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。