第一篇:安卓健研讨会现场提问汇总
安卓健研讨会の现场提问汇总
2012年10月27日,上海佳辰与安卓健研发团队联合举办的安卓健产品研讨会顺利召开,现场的嘉宾与安卓健研发团队的专家们共同探讨了安卓健的作用机制和临床使用效果等问题。以下为研讨会现场提问环节的问题汇总。
问题1:安卓健会不会对正常细胞也有促调亡的作用?安卓健主要是通过RAS途径进行作用的,因为RAS对正常细胞也会产生作用的,那么RAS会不会对其它正常途径产生副作用? 专家解答:
RAS会在正常细胞和癌细胞上都有表现,但在癌细胞的表现量会比正常细胞大很多。也就是说癌细胞比正常细胞依赖RAS的程度是更大的。因为正常细胞对RAS的依赖程度没有那么大,所以说对正常细胞是没有毒性的。但如果是超剂量的使用,正常细胞还是受不了。就像正常喝沙拉油是不会有问题的。如果一次喝一大杯,身体还是会受不了,这是相同的概念。(安卓健研发部研究员陈志铭博士解答)
在安卓健的动物实验中,我们也发现连续服用安卓健对正常细胞不会对产生特异现象,但却可以通过RAS将癌细胞复制的途径给断掉。癌细胞是一个不断增生的细胞,必须要很多养分,所以我们把它的后勤切掉,对正常细胞部分还是提供了正常补给。所以安卓健对正常细胞不会产生细胞毒性。(董事长刘胜勇补充解答)
问题2:安卓健有没有和同类药物做比较的实验,比如说灵芝类提取物。用药的周期,时间性,长久性有没有和同类药物做对比?
专家解答:
实际上现在没有关于RAS同类药物上市,所以说我们没有办法可以比。中药因为成分很复杂,我们一个单体化合物去比较是很难的。在细胞实验中,我们还是用化学药物来作比较。(董事长刘胜勇解答)
问题3:安卓健引起的细胞调亡途径是经典通路还是旁路,如果说没有特定的通路针对癌细胞的话,那怎么会对其它细胞没有产生损伤?
专家解答:
在我们的反应机制里面,是通过抑制粒腺体来抑制癌细胞。癌细胞的增生的需要很多能量,粒腺体的增生在正常细胞里面并没有像在癌细胞里那么快。安卓健是通过抑制粒腺体的增生这样的路径来完成对癌细胞的抑制。(安卓健新药临床实验召集人吴首宝医师解答)
问题4:安卓健是一个靶向药,之前专家提到安卓健的有效率是很高的,想了解生存率有没有提高?靶向药的复发率还是很明显的,安卓健的复发率怎么样的?
专家解答:
使用安卓健,患者在生存率上有显著提高,正如前面屠总所提,他的朋友中有2-3人都已经超过7年的生存期。从目前的临床观察来看,复发率也是非常低。(董事长刘胜勇解答)问题5:临床上靶向药都有耐药的问题。像特罗凯,易瑞沙临床上一般一年左右就出现耐药的问题,想了解安卓健是否有耐药的问题?
专家解答:
所有的化疗和标靶的药物都有抗药性问题,从临床使用观察来看,安卓健的抗药性比其它的药物是非常好的。抗药性和复发可以说是是孪生兄弟。安卓健的抗药性没有发现,复发率也很低。(董事长刘胜勇解答)
问题6:安卓健临床使用案例中是单独使用还是配合化疗放疗等手段共同治疗?
专家解答:
一期临床中,我们采取的是单一剂量,即一天600mg安卓健的剂量。我们所有的临床实验操作都是严格按照美国FDA以及国内SFDA的标准来进行,不与其他药物并用,但与化疗药物并用有正相乘效果,不建议与靶向药物并用。
问题7:安卓健在上海进入医药市场了吗?患者如何联系服用?安卓健的主要治疗对像是肿瘤,除了肿瘤还能冶别的病吗?
专家解答:
现在安卓健正在进行二期临床。在上海的各大医院,如东方肝胆,肿瘤,中山等,安卓健以自费药的形式提供给患者。相关科室的医生也有我们的联系方式,如有需要都可以通过医生和我们联系。适应症就是非小细胞肺癌(美国FDA临床课题)和肝癌(国内临床课题)等晚期癌症。(上海佳辰投资发展有限公司董事长卜国修解答)
问题8:安卓健是通过超临界萃取出来的,萃取出来的形态是怎么样的?
专家解答:
我们的提取流程是超临界做第一次的提取提纯,提纯之后我们用超临界的特殊设备(层析管柱分析仪)再做第二次提纯,提纯之后只有一个成分,是一个纯物质,形态为淡金黄色的液体。(安卓健研发部副总温武哲教授解答)
问题9:安卓健对肝癌非常有效,我们知道肝癌分为胆管细胞型和肝细胞型。安卓健对这两种病理类型有没有不同的效果,或者说是对两种类型都有效果还是只对其中一种病理类型有效果?
专家解答:
都有效,但是胆管型效果更显著。这是有学理上的依据来做治疗的方针。(安卓健新药临床实验召集人吴首宝医师解答)
问题10:安卓健能够有效地抑制骨转移,请问安卓健对成骨细胞和蚀骨细胞有什么影响? 安卓健对机体钙离平衡有什么影响?
专家解答:
我们在动物实验中发现,安卓健可以抑制破骨细胞的活性,提升成骨细胞的活性。安卓健可
以有效缓解骨头疼痛是通过之前介绍的机制将蚀骨细胞的活性降低,同时提升成骨细胞的活性,从而抑制癌细胞对骨头的侵蚀。目前,关于安卓健对机体钙离平衡的影响的研究没有在我们的实验范围内,故不能回答。(安卓健研发部研究员陈志铭博士解答)
问题11:安卓健的服用方法为什么要口服?为什么不选择静脉注射之类的途径?比如说治疗肝病从小鼠尾静脉注射的话,大部分药物都能从门静脉系统入肝,这样是不是利用率会更高?服用安卓健时是不是女性的剂量要小于男性的剂量?
专家解答:
从相关实验的数据来看,安卓健的吸收非常好,所以在实验中采用口服的方式。考虑到有的患者无法进食,未来我们在接下来的三期、四期临床中不排除会考虑IV(Intravenous injection,静脉注射)的方式,这样可以减少用量,对于患者来讲也是降低用药的费用。关于女性的剂量是不是要小于男性的剂量,这个问题我们目前正在做monkey的动物实验,根据目前的观察,male和female的差异性不大,但是最终的结果要等实验结果出来,我们才能真正确定。(董事长刘胜勇解答)
问题12:我主要是研究肝癌的,通过前面专家博士的介绍,安卓健对肝癌是非常有效的。我想问安卓健对肝癌的服用指针是什么?是常规术后就开始用,还是发现有肝内复发转移或者是肝外转移的时候才开始用?
专家解答:
基本上临床用药是不考虑开刀后使用,安卓健是以治疗方式来作用,安卓健的使用以治疗为方针。(安卓健新药临床实验召集人吴首宝医师解答)
第二篇:安卓学习心得
Android学习心得
-----093380117
计算机应用(1)
张峰
1.关于Activity
1.在一个Activity中使用多个View
如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。首先,我们增加一个新的资源描述layout/second.xml。
除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。2.还是回到正道上,多个Activity之间的跳转
Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。
这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。
然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。
2.关于 Intent的使用
Intent分为两大类,显性的(Explicit)和隐性的(Implicit)。一般来说,intent要定位事件的目的地,无外乎需要以下几个信息: 1.种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。
2.类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。
3.组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。4.附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。
其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种松藕合的实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用,可手机上又有什么“较大”的系统呢?无非是可以与不同来源的多个应用之间方便地互操作而已,那么会是什么样的场景呢?比如,给QQ好友发送gmail邮件,用GoogleMap查找QQ好友所在的位置?看上去挺不错的。
关于这个ContentProvider,其实还有话说,它主要是的那些看似数据库操作的方法我们都没真正去实现呢。不过今天就到这里了,等下回再去研究吧。
3.关于ListActivity
准备一个List对象并借助Adapter就可以构造出一个列表。重载onListItemClick方法可以响应选择事件,利用第一个参数可以访问到这个ListView实例以得到选中的条目信息。这里有一点要说明的,就是如果更简单的话,其实连那个setContentView都可以不要了,Android也会自动帮我们构造出一个全屏的列表。但是本例中我们需要一个TextView来显示选中的条目,所以我们需要一个layout.mainb描述一下这个列表窗口。
这里需要注意的是那个ListView的ID,是系统自定义的android:list,不是我们随便取的,否则系统会说找不到它想要的listview了。然后,在这个listview之外,我们又增加了一个TextView,用来显示选中的条目。
再来说说这里用到的ArrayAdapter,它的构造函数中第二个参数是一个资源ID,ArrayAdapter的API文档中说是要求用一个包含TextView的layout文件,平台用它来显示每个选择条目的样式,这里的取值是R.layout.list_row,所以,我们还有一个list_row.xml文件来描述这个布局,相当简单。
从ArrayAdapter上溯到BaseAdapter,发现还有几个同源的Adapter也应该可以使用,象SimpleAdapter和CursorAdapter,还是做个例子来实验一下吧。
然后,在HelloTwoB中的onCreate函数中,修改代码,有几个不同:items的元素是HashMap实例,这是一点变化,然后构造函数除了要求items以外,还要求提供一个string[]来说明用hash表中的哪个字段显示在列表中,而后是一个资源ID的数组。
因为单纯的CursorAdapter是抽象类,所以我用的是它的子类SimpleCursorAdapter,很好理解,先用ContentResolver查询通讯簿得到一个游标,然后告诉SimpleCursorAdapter要用其中的People.NAME作为显示项来构造出一个adapter即可。4.关于Dialog
注意到android.app包下除了Dialog(可用于制作复杂的对话框)以外,还包括了几个系统定义好的对话框类,如DatePickerDialog、TimePickerDialog及AlertDialog。
其中AlertDialog我上回用过一次,基本上就那样子了,今天看看另外两个对话框的使用吧。
很简单的,无非是需要一个OnDateSetListener接口的实现而已,在它里面的dateSet方法中就可以得到选择的日期了。而TimePickerDialog与DatePickerDialog使用如出一辙。
看看另一个ProgressDialog的用法吧,这个类与AlertDialog一样包含了多个static的方法,所以使用起来是非常方便的。比如说,如果我们需要用它来表示一个长时间的操作。
5.关于Service和Notification
大略地看了一下android.app下的Service类,觉得它与Activity非常相似,只是要注意几个地方:
1.生命周期,Service的从onCreate()->onStart(int,Bundle)->onDestroy()显得更为简单。但是它的onStart是带参数的,第一个ID可用来标识这个service,第二个参数显示是用来传递数据的了。比较Activity,传递数据的Bundle是在onCreate就带进入的。
2.Service的启动由Context.startService开始,其实Activity或者Service都是Context的派生类。结束于Context.stopService()或者它自己的stopSelf()。
3.Service还有一个与Activity不一样的是它可以由另一个Context去绑定一个已存在的Service。就是这个方法Context.bindService(),被绑定的Service要求是已经onCreate了但可以没有onStart。在Service类中有个抽象方法getBinder()可以得到这个IBinder对象。关于这方面的细节,以后再看,这里只做个记录罢。
4.与Service有关的还有一个安全的问题,可以在AndroidManifest.xml中用
6.GridView与ImageView
简单一点吧,就瞧瞧那个Grid的效果,Android提供了一个GridView,不过从APIDemo中看来,它似乎与PC上的GRID差别还是挺大的,更像那个IconView的感觉。不知道Android中如何实现表格界面?虽然在移动终端上,表格一般不会有谁使用,大家似乎更倾向于使用ListView,而Android对于ListView则有更简单的实现ListActivity。
很简单,只要重载几个方法就可以了,关键是那个getView方法,它负责构建出每个单元格中的对象实例。这里我们构造的是一个ImageView实例。
然后就是同样的将这个Adapter赋给GridView即可,大家可以看看效果,注意在做这个例子前,先放几个小图片到res/drawable目录下,buildproject一下就可以得到那个R.drawable.a了(这里的a是图像文件名,如a.png)。
在getView方法中我们使用了ImageView类,这又是一个widget。除了上面用到的几个方法以外,还有以下几个方法值得注意: 与图像来源有关的方法,我们只用了资源文件的方式。
还是习惯性跑题了,其实,我是想通过我对这个类的无数次Debugger跟进,说说它的多线程异步处理的解决策略的。他的基本策略如下: 1.当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程(后面会详述...),这个线程里面会构建一个消息循环。
2.获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。3.当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。4.在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。
5.构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。
6.主线程默认的AsyncQueryHandler类的handleMessage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。
7.用户重写的onXXXComplete方法开始工作。
这就是它偷偷摸摸做过的事情,基本还是很好理解的。我唯一好奇的是它的线程管理方式,我猜测他是用的单件模式。第一个AsyncQueryHandler的实例化会导致创建一个线程,从此该线程成为不死老处男,所有的ContentResolver相关的工作,都由该线程统一完成。个人觉得这种解决方式很赞。本来这个线程的生命周期就很难估量,并且,当你有一个ContentProvider的请求的时候,判断你会做更多的类似操作并不过分。就算错了,花费的也只是一个不死的线程(与进程同生死共存亡...),换来的却是简单的生命周期管理和无数次线程生死开销的节约。同时另外一个很重要的问题,他并会涉及到单件中数据同步的问题,每个类都有各自的Handler类,彼此互不干扰,分发可以分别进行。当多个数据请求的时候,在同一个ContentResolver上进行的可能微乎其微,这就避免了堵塞。总而言之,这套解决办法和Android的整体设计算是天作之合了。
所以建议,如果你有什么非ContentProvider操作,却需要异步多线程执行的话,模拟一套,是个不错的策略,当然,具体情况具体分析,生搬硬套是学不好马列主义的。
7.显示控件使用
Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。
从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。
一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。
一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有ListView 的Layout,还有simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。
除了这些要求,做好UI还有注意易用性和效率。快捷键是一个比较不错的选择,在 Activity中调用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以开启快捷键模式,然后你可以将菜单绑定到指定快捷键上就OK了。个人觉得Tip也是一个比较重要的东西,但目前观察看来,这个东西只能够自己提供了。界面的动态性有时候是不可避免的,比如说菜单就是一个需要经常根据光标位置提供不同的选项。这个东西Android很人道的考虑到了,你可以参看NodeList这个Sample。它采取的应该是一个静态模拟动态的方式,这样有助于提高速度。你也可以利用ViewInflate,动态从一个XML创建一个控件。成本据Doc说很大,不到万不得已不要使用。
8.Intent消息传递
在前面写Android的ContentProvider时候,可以看到那是基于观察者模式的一个消息传递方法。每一个Cursor、ContentResolver做为一个小的注册中心,相关观察者可以在这个中心注册,更新消息由注册中心分发给各个观察者。而在MFC或Winform中,都会形成一个消息网,让消息在网中流动,被各节点使用、吃掉或者在出口死掉。
相比之下,我个人觉得基于Intent的Android核心消息传递机制是有所不同的。它应该会有一个全局性的注册中心,这个注册中心是隐性的,整个Android系统中就那么一个。所有的消息接收者,都被隐形的注册到这个中心。包括Activity,Service和IntentReceiver。其实说隐形注册是不确切的,所有注册都还是我们手动告诉注册中心的,只是与传统的方式不一样,我们通常不是通过代码,而是通过配置文件来做。在应用的Manifest中,我们会为一些Activity或Service添加上Intent-filter,或在配置文件中添加
当程序有一个消息希望发出去的时候,它需要将消息封装成一个Intent,并发送。这时候,应该是有一个统一的中心(恩,有可能Android底层实现的时候不是,但简单这样看是没问题的...)接受到这个消息,并对它进行解析、判定消息类型(这个步骤降低了耦合...),然后检查注册了相匹配的filter或receiver,并创建或唤醒接收者,将消息分发给它。这样做有很多好处。虽然这种传递有的时候不如点对点的传递快(这有些需要速度的地方,我们看到Android会通过直接通信来做),但有时候又因为它只经过一跳(姑且这么叫吧...),比复杂的流动又要更快。更重要的是,它耦合性低,在手机平台这种程序组件多变的条件下使用十分适合。并且它可以很容易实现消息的精确或模糊匹配,弹性很大。(我个人曾想在开发一个C++二次平台的时候引入这样的机制,但在C++中,建立一套完整的数据marshal机制不容易,相比之下,用java来做会简单很多...)
恩,废话说了很多,具体讲讲Android中Intent的使用。当你有一个消息需要传递,如果你明确知道你需要哪个Activity或者其他Class来响应的话,你可以指定这个类来接受该消息,这被称为显性发送。你需要将Intent的class属性设置成目标。这种情况很常见,比如startActivity的时候,会清楚当前Activity完了应该是哪个Activity,那就明确的发送这个消息。
但是,有的时候你并不确定你的消息是需要具体哪个类来执行,而只是知道接收者该符合哪些条件。比如你只需要有一个接收者能显示用户所选的数据,而不想制定某个具体的方法,这时候你就需要用到隐形发送(传统上,我们可能会考虑用多态,但显然这种方式更为灵活...)。在Android中,你可以为Intent指定一个action,表示你这个指令需要处理的事情。系统为我们定义了很多Action类型,这些类型使系统与我们通信的语言(比如在Activity里面加一个Main的filter,该activity就会做成该应用的入口点),当然你也可以用于你自己的应用之间的通信(同样当然,也可以自定义...)。强烈建议,在自己程序接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。当然只有Action有时候是不够的,在Android中我们还可以指定catalog信息和type/data信息,比如所有的显示数据的Activity,可能都会响应View action。但很多与我们需要显示的数据类型不一样,可以加一个type信息,明确的指出我们需要显示的数据类型,甚至还可以加上一个catalog信息,指明只有你只有按的是“中键”并发出这样的消息才响应。从上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注册中心会根据这些信息帮你找到符合的接收者。其中class是点对点的指示,一旦指明,其他信息都被忽略。Intent中还可以添加key/value的数据,发送方和接收方需要保持统一的key信息和value类型信息,这种数据的marshal在java里做,是不费什么力气的。
Android的Intent发送,可以分成单播和广播两种。广播的接收者是所有注册了的符合条件的IntentReceiver。在单播的情况下,即使有很多符合条件的接收者,也只要有一个出来处理这个消息就好(恩,个人看法,没找到确切条款或抉择的算法,本来想实验一下,没来得及...),这样的情况很容易理解,当你需要修改某个数据的时候,你肯定不会希望有十个编辑器轮流让你来处理。当广播不是这样,一个receiver没有办法阻止其他receiver进行对广播事件的处理。这种情况也很容易理解,比如时钟改变了,闹钟、备忘录等很多程序都需要分别进行处理。在自己的程序的使用中,应该分清楚区别,合理的使用。
9.ContentProvider数据模型
数据库操作
从我目前掌握的知识来看,SQLite比较轻量(没有存储过程之类的繁杂手段),用起来也比较简单。实例化一个SQLiteDatabase类对象,通过它的APIs可以搞定大部分的操作。从sample中看,Android中对db的使用有一种比较简单的模式,即派生一个 ContentProviderDatabaseHelper类来进行SQLiteDatabase对象实例的获取工作。基本上,ContentProviderDatabaseHelper类扮演了一个singleton的角色,提供单一的实例化入口点,并屏蔽了数据库创建、打开升级等细节。在ContentProvider中只需要调用ContentProviderDatabaseHelper的openDatabase方法获取SQLiteDatabase的实例就好,而不需要进行数据库状态的判断。URI 像进行数据库操作需要用SQL一样,对ContentProivder进行增删改查等操作都是通过一种特定模式的URI来进行的(ig:content: //provider/item/id),URI的能力与URL类似,具体细节可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder类并实现insert, delete, update等抽象函数即可。在这些接口中比较特殊的是getType(uri)。根据传入的uri,该方法按照MIME格式返回一个字符串(==!没听过的诡异格式...)唯一标识该uri的类型。所谓uri的类型,就是描述这个uri所进行的操作的种类,比如content://xx/a与 content://xx/a/1不是一个类型(前者是多值操作,后者是单值),但content://xx/a/1和content://xx/a/2 就会是一个类型(只是id号不同而已)。
在ContentProvider通常都会实例化一个ContentURIPraser来辅助解析和操作传入的URI。你需要事先(在static域内)为该ContentURIPraser建立一个uri的语法树,之后就可以简单调用 ContentURIPraser类的相关方法进行uri类型判断(match方法),获取加载在uri中的参数等操作。但我看来,这只是在使用上简化了相关操作(不然就需要自己做人肉解析了...),但并没有改变类型判定的模式。你依然需要用switch...case...对uri的类型进行判断,并进行相关后续的操作。从模式来看,这样无疑是具有强烈的坏味道,类似的switch...case...代码要出现N此,每次一个 ContentProvider做uri类型的增减都会需要遍历修改每一个switch...case...,当然,如果你使用模式(策略模式...)进行改造对手机程序来说无疑是崩溃似的(类型膨胀,效率降低...),所以,只能是忍一忍了(恩,还好不会扩散到别的类中,维护性上不会有杀人性的麻烦...)。增删改查
ContentProvider 和所有数据源一样,向外提供增删改查操作接口,这些都是基于uri的指令。进行insert操作的时候,你需要传入一个uri和 ContentValues。uri的作用基本就限于指明增减条目的类型(从数据库层面来看就是table名),ContentValues是一个 key/value表的封装,提供方便的API进行插入数据类型和数据值的设置和获取。在数据库层面上来看,这应该是column name与value的对应。但为了屏蔽ContentProvider用户涉及到具体数据库的细节,在Android的示例中,用了一个小小的模式。它为每一个表建一个基于BaseColumn类的派生类(其实完全可以不派生自BaseColumn,特别当你的表不基于默认的自动id做主键的时候),这个类通常包括一个描述该表的ContentURI对象和形如 public static final TITLE = “title”这样的column到类数据的对应。从改变上角度来看,你可以修改column的名字而不需要更改用户上层代码,增加了灵活性。insert方法如果成功会返回一个uri,该uri会在原有的uri基础上增加有一个row id。对于为什么使用row id而不是key id我想破了脑袋。到最后,我发现我傻了,因为ContentProvider不一定需要使用数据库,使用数据库对应的表也可以没有主键,只有row id,才能在任何底层介质下做索引标识。
但,基于row id在删除和修改操作是会造成一定的混乱。删除和修改操作类似。删除操作需要传入一个uri,一个where字串,一组where的参数(做条件判定...),而修改操作会多一个ContentValues做更新值。着两个操作的uri都支持在末尾添加一个row id。于是混乱就出现了。当在where参数中指明了key id,而在uri中提供了row id,并且row id和key id所指函数不一致的时候,你听谁的?示例代码中的做法是完全无视row id(无语...),如此野蛮的方式我估计也只能在示例中出现,在实际中该如何用,恩,我也不知道。幸运的是,我看了下上层对 ContentProvider的删除操作,其实都不会直接进行,而是通过调用Cursor的delete方法进行,在这前提下,我想Cursor会处理好这些东西吧。
最后一个操作是查询操作,可以想见,查询的参数是最多的,包括uri和一组条件参数。条件参数类型和标准的sql类似,包括 sort, projection 之类的。从这些参数到sql语句的生成,可以寻求QueryBuilder类的帮助,它提供了一组操作接口,简化了参数到sql的生成工作,哪怕你不懂 sql都完全没有问题(这话说的我自己都觉得有点悬...)。查询返回一个Cursor。Cursor是一个支持随机读写的指针,不仅如此,它还提供了方便的删除和修改的API,是上层对ContentProvider进行操作一个重要对象,需要仔细掌握(Cursor还可以绑定到view上,直接送显,并与用户进行交互,真是程序越往上,封装越好,工作越机械没有复杂性了...)。数据模型
在与界面打交道的Cursor、ContentResolver等数据操作层中,大量采用观察者模式建立数据层与显示层的联系。一个显示层的视图,可以做成某一种观察者注册到Cursor或ContentResolver等数据中间层中,在实现底层ContentProvider中,我们需要特别注意在对数据进行修改操作(包括增删改...)后,调用相应类型的notify函数,帮助表层对象进行刷新(还有一种刷新方式是从一个view发起的)。可以看到 Android的整体数据显示框架有点像MVC的方式。Cursor、ContentResolver相当于控制层,数据层和显示层的交互通过控制层来掌管,而且控制层很稳定不需要特别定制,通常工作只在定制数据层和显示层空间,还是比较方便和清晰的。
10.学习感想
通过这学期对安卓的学习,大概了解了以上一些知识,对安卓有了初步的了解,这几个月给我的东西我想用有形的和无形的两部分概叙,形的当然就是技术水平的长进,虽然其中肯定有很多的不足,相信慢慢会体会到。
第三篇:保管员现场提问
江苏康惠药房连锁有限公司文件
保管人员现场提问
岗位的操作规程是什么?
核对入库单据与实物,核对一致,按照验收员验收结论放入仓库相应区域。单据与实货不符的、包装不符合要求的,应暂停入库,反馈验收员重新核实、处理。
按照调拨出库单,进行药品配货出货。在单据上签写全名、日期。将药品放到药品复核区,与复核员进行交接。
冷库、阴凉库及常温库的温湿度范围是什么? 常温库:10-30℃,阴凉库0-20℃,冷库2-10℃。湿度:35-75%
验收员交接时,重点要注意哪些内容? 单据与实物一致性
严格按照验收结论指定区域放置已验收的到货药品。
平时应当采取哪些措施保证药品质量安全? 保证仓库储存条件符合在库药品储存要求。垛与墙、顶、梁、地面的间距符合要求
仓库配备遮光窗帘、空调、灭蝇灯、电子猫等避光、遮光、通风、防潮、防虫、防鼠等设备
发现质量异常品种应挂牌暂停出库,报质量管理部处理。无关物品不得在库区存放。
不得有影响药品质量和安全的行为(嬉戏、打闹、就餐、喝水),个人物品要集中存放,与药品存储区域隔离。
常温药品储存时应注意什么问题?
仓库温湿度调控范围符合常温药品储存要求。
分几种色标?分别代表什么区域?
3种颜色,黄色:待验区、退货区、待处理区;绿色:合格区、发货区;红色:不合格区。
药品堆码时应注意什么? 药品按批号堆码,不同批号的药品不得混垛,垛间距不小于5厘米,与库房内墙、顶、温度调控设备及管道等设施间距不小于30厘米(按照测试合格距离放置),与地面间距不小于10厘米。
/ 2
江苏康惠药房连锁有限公司文件
不能超过外包装规定高度。
拆除外包装的零货药品应当如何存放?
集中零货位存放,不得零散放置在整件药品货架上。
哪些情况不允许出库? 药品包装出现破损、污染、封口不牢、衬垫不实、封条损坏的; 包装内有异常响动或者液体渗漏的;
标签脱落、字迹模糊不清或者标识内容与实物不符的; 药品已超过有效期的; 悬挂“暂停发货”标志的;
发现问题如何处理?(如原装少、破损等。)报告质量管理部予以确认处理。
如何进行复核? 出库复核记录包括哪些项目?
药品复核应依据“调拨出库单”逐批号进行核对,并对外观质量状况进行检查。复核记录内容包括:客户名称、药品名称、剂型、规格、数量、批号、有效期、生产厂商、出库日期、质量状况、复核员。
保管员的质量目标是什么?
执行药品按储存条件分类存放,不同批号分开堆码,五距规范,不规范次数≤2次/月。
(五距)垛与墙的间距不小于30厘米
垛与屋顶(房梁)间距不小于30厘米
垛与仓库相关设备间距不小于30厘米
垛与地面的间距不小于10厘米
同品种不同批号散货分开摆放,距离不得小于5厘米
/ 2
第四篇:现场提问问题
1.现场小朋友抢答题,七夕节是讲的是谁的故事?
2.中国民生银行中泰华庭社区银行,在中泰华庭的哪个位置?
3.民生银行的标志是什么?
4.民生小区智家卡有什么优惠?
5.民生银行开卡都要带什么东西?
6.民生非凡系列理财产品起购金额是多少?
7.目前民生的理财产品都有多长期限的?
8.民生银行如意宝起存金额是多少?
9.小区定向型理财产品,每周最晚什么时间报名?
10.中泰华庭社区银行理财咨询电话是多少?
第五篇:如何学习安卓
如何学习安卓
想学编程开发,那要先会一门编程语言,现在可以试着去学学C语言,虽然这个安卓沾不上边,但是,C语言的编程思想还是很重要的,学完了C语言之后,他的语法基本上和所有的编程语言都很相像,能影响你的思维,帮助你理解其他的编程语言的。之后呢,在好好看看《数据结构》,这很重要。然后再去学学Java语言,因为Android的应用的开发语言用的是Java,所以一定要好好学习。
最后了解下数据库,我们在学习数据库之前都先学了《数据库原理》《离散数学》《关系代数》,有了这些基础之后再去学数据库,数据库也有很多可以选择的,推荐mysql。
加油!