Xamrin开发安卓笔记(三)

这次记录的是滚动条跟sqlite创建、存储和读取。

先说滚动条相关,这个是比较简单的知识点。

当有一屏的东西需要填写的时候例如下图

我们都知道如果点击第一个文本框则会出现输入法。但是如果没有滚动条的话,只能依靠输入法中的回车一个一个的向下移动(虽然现在输入法都带自我关闭功能),很不友好,那么就需要滚动条,看了一下布局属性有滚动条,但是使用起来不好使。隐约想起来,安卓有滚动条控件,就在左边找了一下,果真找到这个玩意了。如下图

但是这玩意如何使用呢,又进行了一次搜索,原来这个东西可以套在布局标签的外面,让整个布局带有滚动条(这个滚动条是横向和纵向都带的,可以通过属性关闭)。

套在外面发现划红线了,生成的时候报错。

错误 3 未定义命名空间前缀“android”。

解决办法是把

    xmlns:android="http://schemas.android.com/apk/res/android"

挪动到滚动条里面即可。感觉这句话的意思是定义这个标签里面的所有标签都执行安卓这个定义。

这样在出现输入法的时候就可以出现滚动条了。

简单吧,更多属性可以自行研究。

接下来说一下 本地库 sqlite

首先他跟 T-sql语法稍微有一丝不同大部分相似,不同之处以后一点点的说,一次性全写了我也记不住。

在网上和书上看到很多创建数据库的方式,不过没有一个完全正确的,书上的更扯蛋,很多内容已经被整合没了。连引用空间都不一样了(书上的语法貌似是很老的语法),所以这些内容只能作为线索来参考,甚至需要去参考java的安卓开发(布局方面请直接参考java开发方式)。

所以我找到了一个简单明了的创建本地库的方式,也总结了一套自己创建本地库的基本原则。

1,在肯定需要使用的时候创建

2,没必要创建的时候不创建

3,如果整套程序都需要使用本地库,那么在程序运行最初就创建

4,如果有条件手动创建好直接开发使用

创建和使用数据库需要引用

using Android.Database.Sqlite;

有些书上和一些网上资料要引用mono,但是在我这个版本里面已经不存在了(net4.5)。

代码如下

SQLiteDatabase Database = null;//在最外称定义这个

        /// <summary>
        /// 创建数据库
        /// </summary>
        private void CreateData()
        {
            string strDataName = "PhoneBook.db3";
            Database = this.OpenOrCreateDatabase(strDataName, FileCreationMode.Private, null);
            string strTable = "create table if not exists  book(name,sex,age,phone)";
            Database.ExecSQL(strTable);

        }    

在最外层定义数据库连接方法,因为一会有使用(因为是demo所以这么些,正式项目肯定要写的比现在的好一些)

定义创建方法定义数据库名称,DB3是数据库扩展名,

OpenOrCreateDatabase 的方法大概意思是如果这个数据库存在则打开否则创建数据库,并且是私有模式创建。

create table if not exists  book(name,sex,age,phone)这句话的意思是这个表如果不存在则创建。mssql里面就不能酱紫写。

最后一句话的意思是执行sql。是不是跟ADO.NET很相似!

ok了至此我们做了一个创建一个数据库和表的功能,然后在OnCreate方法调用这个方法就创建了一个数据库。

网上有一些方法是利用IO去找这个库是否存在,说一下 IO的方式创建的数据库路径跟这个方法创建的路径完全不一样(断点调试可以看一下就知道了)

然后开始做按钮的保存事件如下代码

 1  btnSeve.Click += delegate
 2             {
 3                 EditText txtName = FindViewById<EditText>(Resource.Id.txtName);
 4                 EditText txtAge = FindViewById<EditText>(Resource.Id.txtAge);
 5                 RadioGroup rdogSex = FindViewById<RadioGroup>(Resource.Id.rdogSex);
 6                 RadioButton rdoSex = FindViewById<RadioButton>(rdogSex.CheckedRadioButtonId);
 7                 ContentValues cv = new ContentValues();
 8                 cv.Put("name", txtName.Text);
 9                 cv.Put("sex", rdoSex.Text);
10                 cv.Put("age", txtAge.Text);
11                 cv.Put("phone", txtPhone.Text);
12                 long a = Database.Insert("book", null, cv);
13                 var callDialog = new AlertDialog.Builder(this);
14                 callDialog.SetMessage("保存成功");
15                 callDialog.SetNeutralButton("确定", delegate
16                 {
17                     var userDetail = new Intent(this, typeof(UserDetailActivity));
18                     //如果不写参数则是无参数跳转
19 
20                     StartActivity(userDetail);
21                 });
22                 callDialog.Show();
23             };

ContentValues cv = new ContentValues();

这个类似于ADO.NET中的sqlparameter类似put方法的第一个参数是列明,第二个是值。

long a = Database.Insert("book", null, cv);插入到这个表中(本来想详细写一下,无奈英语太渣,中间参数意思没搞明白)。

这样就执行了一个插入的功能,当然也可以使用ExecSQL方法来用sql执行插入,这里不细说了。

跳转到另一个页面做查询,做查询之前也要打开数据库。用打开或者创建的方式进行打开数据库。

查询代码如下

 1 var data = Database.Query("book", new string[] { "name,sex,age,phone" }, "", null, "", "", "");
 2             while (data.MoveToNext())
 3             {
 4                 lblDetail.Text += data.GetString(0)
 5                     + data.GetString(1)
 6                     + data.GetString(2)
 7                     + data.GetString(3) + "|";
 8             }
 9             data.Close();
10             Database.Close();

这个查询代码就有一些类似于java的查询方式,查询哪个表,那些字段,后面的条件为空了,这些条件有排序 where 等(要查询的表名,要获取的字段名,WHERE 条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。)。

循环内部的GetString(Index)是列的位置,位置是从0开始。

基本就到这了,下次差不多是gridview方面相关内容了。

 

 

最后禁止转载。话说谁能告诉我怎么加内个禁止转载的样式??

来源于http://www.cnblogs.com/minCS/p/4118170.html

posted @ 2014-11-24 10:55  皮卡丘\(≧▽≦)/  阅读(1138)  评论(6编辑  收藏  举报