发布网友 发布时间:2022-04-20 07:51
共1个回答
热心网友 时间:2023-10-06 07:23
用不用主要看实际应用的需求。 众所周知,A应用要访问B应用中的数据,最好的方法就是B应用提供给B一些访问接口,然后A通过这个接口来进行对B中的数据进行增删改查 为了统一接口,Android中申明了内容提供者(ContentProvider)这样一个组件
连接?如果我没有理解错的话可能你是想读写win变量吧? 在脚本中,C脚本基本是这样的语句: Float F; F=GetTagFloat(“TAG1”)这样就可以读出TAG1的数值,不管TAG1是外部变量还是内部变量,在脚本中都要加上“”,否则就默认是对脚本内部使用的...
一、外部类访问内部类的成员需要创建内部类的对象,之后可以访问内部类的任何成员,包括private成员,需要注意的是成员内部类不可以有静态成员。
二、内部类不可以直接实例化,要通过外部类才可以,但是静态成员要求系统默认初始化,所以会出现矛盾,解决的好办法就是规定:成员内部类不可以有静态成员,静态初始化块,静态方法等。
三、在static方法(类加载时已经初始化)调用内部类的必须先创建外部类。
下面在说下嵌套类:如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested
class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部
类是static的时,就不是这样了。嵌套类意味着:
1. 要创建嵌套类的对象,并不需要其外围类的对象。
2. 不能从嵌套类的对象中访问非静态的外围类对象。
在你们的路由器的虚拟服务里映射80端口给WEB服务的那台电脑即可用你的公网IP域名访问了
示例AessFromSharePreferenceDemo将说明如何读取其他应用程序(博客中另一项目:DemoSharedPreferences)中保存的SharedPreferences数据
1)新建android项目,项目名称:AessFromSharePreferenceDemo
2)在继承自Activity的类中编写相应代码:
package .mesada.demo1;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
/**
* This is a demo about aess SharedPreferences.
*
* @author Xiaolong Long
* @date 2010-12-30
* @version 1.0
*/
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private static final boolean mIsPrintInfo = true;
public static final String PREFERENCE_PACKAGE = ".mesada.demo";
public static final String PREFERENCE_NAME = "MyPrefsFile";
public static final String KEY_USERNAME = "USERNAME";
public static final String KEY_PWD = "PASSWORD";
public static int MODE = Context.MODE_WORLD_READABLE
+ Context.MODE_WORLD_WRITEABLE;
TextView mUserNameView;
TextView mPwdView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
if (mIsPrintInfo)
Log.i(TAG, "onCreate()...");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupControlers();
Context context = null;
try {
context = createPackageContext(PREFERENCE_PACKAGE,
Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
SharedPreferences settings = context.getSharedPreferences(
PREFERENCE_NAME, MODE);
String userName = settings.getString(KEY_USERNAME, "姚明");
String userPwd = settings.getString(KEY_PWD, "123456");
mUserNameView.setText(userName);
mPwdView.setText(userPwd);
}
/**
*
* Find the views that were identified by the id attributes from the XML.
*
* @param
* @return
* @date 2010-12-30
* @author Xiaolong Long
*/
private void setupControlers() {
if (mIsPrintInfo)
Log.i(TAG, "setupControlers()...");
mUserNameView = (TextView) findViewById(R.id.userName);
mPwdView = (TextView) findViewById(R.id.password);
}
}
2.main.xml 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=":schemas.android./apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lblusername" />
<TextView
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lblpassword" />
<TextView
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
3.AndroidMainfest.xml 文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=":schemas.android./apk/res/android"
package=".mesada.demo1"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest>
4)完成。
1、am.killBackgroundProcesses(String packageName);
这个方法只能停止在后台的应用,如果应用在前台就不能用。
2、andorid.os.Process.killProcess(int pid);
这个方法对于前台应用同样没用,因为的我需求时杀死前台的app所以没有测试后台是否能够杀死,但是这个用来大范围的杀死后台进程是比较好用的:
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo info:infos) {
if (info.processName.equals(MainActivity.packageName)){
android.os.Process.killProcess(info.pid);
}
用apkplug框架吧,不用android:sharedUserId 可以直接运行和共用未安装的apk。
1. SQLite数据库特点
(1)SQLite数据库是开源的嵌入式数据库,无需的数据库引擎,直接嵌入到应用程序进程中,因此,通过API,应用程序可以直接操作它。
(2)事务的处理是原子的,一致的,的,可持久化的(ACID),即使在系统崩溃和掉电后。
(3)SQLite数据库通过独占性与共享锁来实现事务的处理。
(4)一个单独的跨平台的磁盘文件就能够存储一个数据库。
(5)能支持2TB级的数据。
(6)自包含,无外部依赖性。
(7)支持NULL,INTEGER,NUMERIC,REAL,TEXT和BLOG等数据类型。
(8)SQLite数据库没有用户帐户的概念。数据库的权限仅依赖于文件系统。
2. SQLite数据库的基本操作
(1)建立数据库
sqlite3 data.sqlite3
在当前目录下建立了名为data.sqlite3的数据库。
(2)建立数据表
create table call_list (id INTEGER PRIMARY KEY, type NUMERIC,telnum NUMERIC,bttime TEXT,tcount NUMERIC,charge_rate NUMERIC,charge_sum NUMERIC);
建立了名为 call_list的数据表,有7个字段,分别为id,type,telnum,bttime,tcount,charge_sum.charge_rate.
(3)向数据表中插入数据
insert into call_list values ($num,1,2,'new',4,5,6);
(4)查询数据表中的数据
select * from call_list;
(5)修改call_list表中的数据
update call_list set id=00001000 where id=10001;
(6)删除表中的数据记录
delete from call_list where id=1000;
(7)SQlite中的其它常用命令
.tables -列出所有的数据库中的数据表
.schema tablename -列出指定数据表的结构
.quit -离开数据库
(8)SQLite数据库的导入与导出
a.将data.sqlite数据库的数据全部导出:
sqlite3 data.sqlite
>.output dd.sql
>.mp
这样,数据就保存在dd.sql的文件中,注意这个文件不是数据库,而是SQL语句。
然后再把这些数据导入到另外一个数据库data1.sqlite数据库中。
sqlite3 data1.sqlite
>.read dd.sql
这样,数据就从data.sqlite数据库复制到data1.sqlite数据库中去了。
b.将数据表中的数据导出到a.txt中去
.output a.txt 输出重定向到a.txt
select * from call_list;
c.将导出的表中的数据导入到另一个数据库的新建的表中去
如:当从data.sqlite中的call_list表中导出了数据,再导入到另外一个数据库表call中去。
首先建立表call.
然后.import a.txt call 即可。
3. C语言操作Sqlite数据库
API:
int sqlite3_open(const char* filename,sqlite3**ppdb);
第一个参数用来指定数据库文件名。
第二个参数是一个数据库标识符指针。
如果打开数据库成功,则返回0,否则返回一个错误代码。
int sqlite3_close(sqlite3*);
传递的参数是数据库标识符指针用来关闭数据库,操作成功是返回0,否则返回一个错误代码。
int sqlite3_errcode(sqlite3*db);
const char* sqlite3_errmsg(sqlite3* db);
const char* sqlite3_errmsg16(sqlite3* db);
这三个函数都是返回错误信息,第一个函数返回的是最近调用数据库接口的错误代码,第二,第三个函数是返回最近调用数据库接口的错误信息。第二个函数返回的错误信息是用UTF-8编码的,第三个函数返回的错误信息是用UTF-16编码的。
int sqlite3_exec(sqlite3*,const char*sql,int(*callback)(void*,int,char**,char**),void*,**errmsg);
这个函数非常重用,是用来执行SQLite数据库的SQL语句的。
第一个参数是sqlite数据库标识符指针。
第二个参数是要执行的SQL语句。
第三个参数是一个回调函数,在执行查询操作时用到,其它的操作可以传空值即NULL。
第四个参数是传递给回调函数第一个参数的实参。
第五个参数是一个错误信息。
可以把resteasy理解为servlet,只不过它支持rest风格的接口定义方式。jsp中form表单提交时一定要指定一个action,告诉浏览器请求服务器的地址。然后resteasy需要将该地址映射到具体类的具体方法上,该方法就会执行。
下面把我这几天做导入的方式总结下,供大家参考下,只提供思路,具体实现自己去想。 1.我们往数据库中导入的数据通常是有固定的模板的,也就是有列头,但是可能excel中的一条数据分布存储在不同的数据表中,那么我们怎么来导入了,我们可以在类文件中直接拼接sql语句插入,这样做的话我认为比较麻烦。我的做法是:在数据中建一个中间表暂且叫做Temp表跟excel中列一一对应,其中表中多加state列用来标识数据验证失败还是成功的(0代表数据没有问题,-1代表有问题)、failReason记录导入失败原因,然后再添加一个配置文件来做excel列和数据表的映射。 2.要导入的数据通常要做验证,那些不符合导入规则的数据时不允许或者不能导入的。我把数据分两步来验证,一部分在代码段验证,一部分在数据库验证。至于怎么分那就自己去根据情况分析了。我是把诸如字符长度*,正则表达式规则*等放 在代码段验证,把诸如数据库中字典值是否存在等要访问数据库的验证放在数据中验证,这样的话就可以减少访问数据库的次数。把再客户端验证过的数据,不管是通过的不同过的都插入到temp表中,只是state值不同。 3.然后怎么把插入temp中数据分别插入到不同的数据表中了,大家一定想到了触发器,没有错,我用的就是after触发器,在我把excel中的数据插入到temp表中的时候,那么就会触发after触发器,在触发器中对插入的数据进行处理,如果插入的数据state值为-1,代表在代码端的验证就没有通过,那么就不需要进行下一步处理了,如果state值为0,那么在触发器中接着处理,比如检测字典值在字典表中存不存在等,如果不满足要求就把temp表中的当前插入的记录state值改成-1,把校验失败原因更新到failReason字段中,不再处理。如果一切校验都没有问题的话,那么就编写插入语句,把数据插入到不同的表中去。 4.数据导入完成了,那么那些有问题数据怎么办了?把它查询出来生成一个按原模板后加一列“失败原因”导成excel文件,其实就是state值为-1的那些记录,然后返回给用户查看。 通过以上步骤之后那么整个导入功能就完成了,以上只是一种思路,望大家完善。 本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。