如果您对AndroidSDKContentLoader遇到问题.parseSdkContent失败感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于AndroidSDKCont
如果您对Android SDK Content Loader遇到问题. parseSdkContent失败感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Android SDK Content Loader遇到问题. parseSdkContent失败的详细内容,我们还将为您解答android sdk path not specified的相关问题,并且为您提供关于Android ContentProvider+ContentObserver、Android sdk content loader 0% 的解决方案、Android SDK Document 框架导读的翻译和注解[5]——Content provider、Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】的有价值信息。
本文目录一览:- Android SDK Content Loader遇到问题. parseSdkContent失败(android sdk path not specified)
- Android ContentProvider+ContentObserver
- Android sdk content loader 0% 的解决方案
- Android SDK Document 框架导读的翻译和注解[5]——Content provider
- Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】
Android SDK Content Loader遇到问题. parseSdkContent失败(android sdk path not specified)
尝试更新ADT插件并下载Android 5.0 SDK后,出现错误:
“ Android SDK Content Loader遇到问题.
parseSdkContent失败
无法初始化类android.graphics.Typeface“
http://i.stack.imgur.com/xR17Y.png
我删除了Eclipse,Android SDK,“.android”和工作区文件夹.
我下载了新的Eclipse(4.4.1),ADT插件(23.0.4.1468518)和Android SDK(仅5.0 API 21):
http://i.stack.imgur.com/cjECP.png
创建一个新的空项目,我得到了同样的错误.
我应该删除它以使其看起来干净吗?
更新:我在干净的操作系统上安装了所有内容,但出现了错误.
请提供任何解决方案.
解决方法:
根据AOSP Issue Tracker,此错误是由渲染库引起的.
解决方法:
>下载API 20(4.4W)的SDK平台;
>转到/ platforms / android-21 / data文件夹;
>重命名layoutlib.jar(用于备份);
>将相同文件从android-20文件夹复制到此文件夹;
>重新启动Eclipse.
Android ContentProvider+ContentObserver
说明:文章仅供本人学习记录所用。
1. 理解含义:
ContentProvider: 内容提供者,将数据以表的形式进行操作。主要实现应用程序间数据共享,操作系统本地数据(包括短 信、音频、视屏、数据库)。
ContentObserver:内容观察者,监听数据变化。
2. 使用方法:
ContentProvider:
1)步骤:新建 MyProvider 类继承 ContentProvider 类;注册 URI; 重写方法(onCreate、query、bulkInsert、insert、 delete、update); 在 AndroidManifest.xml 中配置 provider;
2)代码:
public class MyProvider extends ContentProvider {
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int INSERT = 1;
private static final int UPDATE = 2;
private static final int DELETE = 3;
private static final int QUERY = 4;
private static final int INSERTS = 5;
private DBHelper dbOpenHelper;
private String TAG = "Provider";
static {
// 为UriMatcher注册si四个Uri
matcher.addURI(Picture.AUTHORITY, "insert", INSERT);
matcher.addURI(Picture.AUTHORITY, "update", UPDATE);
matcher.addURI(Picture.AUTHORITY, "delete", DELETE);
matcher.addURI(Picture.AUTHORITY, "query", QUERY);
matcher.addURI(Picture.AUTHORITY, "inserts", INSERTS);
//说明Picture.AUTHORITY:表示你要操作的ContentProvider,一般以要操作的实体类的包名命名。
}
@Override
public boolean onCreate() {
//获取数据库辅助类
dbOpenHelper = DBHelper.getInstance(getContext());
DatabaseManager.initializeInstance(dbOpenHelper);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
int code = matcher.match(uri);
Cursor c = null;
switch (code) {
case QUERY:
SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
c = database.query("picture", projection, selection, selectionArgs,
null, null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
DatabaseManager.getInstance().closeDatabase();
case UriMatcher.NO_MATCH:
Log.i(TAG, "------------未知的URI" + uri);
break;
}
return c;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int code = matcher.match(uri);
switch (code) {
case INSERT:
SQLiteDatabase database = DatabaseManager.getInstance()
.openDatabase();// 线程安全并发操作数据库
try {// 获得数据库实例
database.insert("picture", null, values);
getContext().getContentResolver().notifyChange(uri, null);
} catch (Exception ex) {
Log.i(TAG, "insert ex=====" + ex.toString());
} finally {
DatabaseManager.getInstance().closeDatabase();
}
break;
case UriMatcher.NO_MATCH:
Log.i(TAG, "------------未知的URI" + uri);
break;
}
return null;
}
/**
* 批量插入
*/
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
int code = matcher.match(uri);
switch (code) {
case INSERTS:
SQLiteDatabase database = DatabaseManager.getInstance()
.openDatabase();// 线程安全并发操作数据库
try {// 获得数据库实例
int numValues = 0;
numValues = values.length;
for (int i = 0; i < numValues; i++) {
ContentValues value = values[i];
database.delete("picture", "name = ?",
new String[] { String.valueOf(value.get("name")) });
Log.i(TAG,
"name===== values"
+ String.valueOf(value.get("name")));
database.insert("picture", null, values[i]);
Log.i(TAG, "Value insert====" + i);
}
getContext().getContentResolver().notifyChange(uri, null);
} catch (Exception ex) {
Log.i(TAG, "insert ex=====" + ex.toString());
} finally {
DatabaseManager.getInstance().closeDatabase();
}
break;
case UriMatcher.NO_MATCH:
Log.i(TAG, "------------未知的URI" + uri);
break;
}
return 0;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int code = matcher.match(uri);
switch (code) {
case DELETE:
SQLiteDatabase database = DatabaseManager.getInstance()
.openDatabase();
int i = 0;
try {
i = database.delete("picture", selection, selectionArgs);
if (i > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
} catch (Exception ex) {
Log.i(TAG, "delete ex====" + ex.toString());
} finally {
// database.close();
DatabaseManager.getInstance().closeDatabase();
}
return i;
case UriMatcher.NO_MATCH:
Log.i(TAG, "------------未知的URI" + uri);
break;
}
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
int code = matcher.match(uri);
switch (code) {
case UPDATE:
// SQLiteDatabase database = dbOpenHelper.getReadableDatabase();
SQLiteDatabase database = DatabaseManager.getInstance()
.openDatabase();
int i = 0;
try {
i = database
.update("picture", values, selection, selectionArgs);
if (i != 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
} catch (Exception ex) {
Log.i(TAG, "update ex===" + ex.toString());
} finally {
// database.close();
DatabaseManager.getInstance().closeDatabase();
}
return i;
case UriMatcher.NO_MATCH:
Log.i(TAG, "------------未知的URI" + uri);
break;
}
return 0;
}
}
//在数据库操作类中添加以下方法。
//单条数据添加
public static void addPicture(Picture picture) {
Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/insert");
ContentValues values = new ContentValues();//封装数据
values.put("name", picture.name);
...
AppApplication.getInstance().getContentResolver().insert(uri, values);
}
//多条数据添加
public static void addPictures(List<Picture> pictures) {
Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/inserts");
ContentValues[] values = new ContentValues[pictures.size()];
for (int i = 0; i < pictures.size(); i++) {
Picture picture = pictures.get(i);
ContentValues value = new ContentValues();
value.put("name", picture.name);
...
values[i] = value;
}
Log.i(TAG, "addPictures_values_size=====" + values.length);
AppApplication.getInstance().getContentResolver().bulkInsert(uri, values);
}
//删除操作
public static void deletePictureTag() {
Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/delete");
int i = AppApplication.getInstance().getContentResolver()
.delete(uri, "whereName = ?", new String[] { "value" });
}
//修改操作
public static void updatePicture(Picture picture) {
Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/update");
ContentValues values = new ContentValues();
values.put("tagStatus", picture.tagStatus);
int i = AppApplication.getInstance().getContentResolver()
.update(uri, values, "whereName = ?", new String[] { picture.name });
}
//AndroidManifest.xml中配置provider
<provider
android:name="com....provider.MyProvider"//包名
android:authorities="com....provider.myProvide" />
ContentObserver:
1) 步骤:注册与注销 ContentObserver;添加 ContentObserver 方法。
2) 代码:
//uri与provider中注册的uri对应
Uri uri = Uri.parse("content://" + Picture.AUTHORITY + "/insert");//监听添加
getContentResolver().registerContentObserver(uri, true, cob);
Uri uri_inserts = Uri.parse("content://" + Picture.AUTHORITY+ "/inserts");//监听批量添加
getContentResolver().registerContentObserver(uri_inserts, true, cob);
Uri uri_update = Uri.parse("content://" + Picture.AUTHORITY + "/update");//监听修改
getContentResolver().registerContentObserver(uri_update, true, cob);
getContentResolver().unregisterContentObserver(cob);//在onDestroy销毁
//监听数据改变的方法
private ContentObserver cob = new ContentObserver(new Handler()) {
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//改变数据时做出相应的操作
......
}
}
Android sdk content loader 0% 的解决方案
方法参考 http://jingyan.baidu.com/article/8cdccae99a6d4b315413cd97.html,比较推荐方法 4
关闭 Eclipse,删掉 Eclipse WorkSpace 下.metadata\.plugins\org.eclipse.core.resources\.projects 文件夹下的所有内容,再重启 Eclipse。
Android SDK Document 框架导读的翻译和注解[5]——Content provider
Content provider:
Content provider将当前应用程序的某些特定数据,提供给其他应用程序。这些数据可以存储在文件系统,SQLite数据库,或者是任意其他有意义的存储方式。content provider 继承自ContentProvider基类,实现了一些标准的方法集合,这些方法可以让其他的应用程序访问和存储content provider控制数据类型。但是, 应用程序并不是直接调用这些方法,而是用一个ContentResolver对象调用这些方法。ContentResolver可以和任意 contentProvider对话,ContentResolver 通过和provider的协作,实现跨进程的通信。
查看文档中关于Content Provider的部分,获得更多关于content provider的使用。
通观Android这四类组件和进程的关系:只要存在一个请求需要被特定的组件处理,Android必须保证组件所在的应用程序进程是运行的, 如有需要(比如,应用程序进程不存在的情况下),启动这个应用程序进程, 同时需保证存在可用的组件实例, 如有需要(比如,组件被销毁),创建这个组件实例。
例一: 使用系统提供的数据, 典型应用是联系人和电话的查询,下面是一个典型的所有电话号码的查询:
// Get a cursor with all phones Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null); startManagingCursor(c); // Map Cursor columns to views defined in simple_list_item_2.xml ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, c, new String[] { Phones.NAME, Phones.NUMBER }, new int[] { android.R.id.text1, android.R.id.text2 }); setListAdapter(adapter);
为自己的应用程序实现数据访问的ContentProvider:
以Content Provider的方式访问数据, 需要准备以下几个步骤:
1. 继承ContentProvider类
2. 定义public static final 的Uri类型变量, 并命名为CONTENT_URI 并设置好它的标准头部, 授权, 数据类型等.
3. 构件数据存储, 数据存储一般有:Preferences, files, DataBases, NetWorks
4. 实现1中的抽象方法, 特别是insert, query, delete, update方法, 这些方法都是对3中具体数据存储操作的封装.
当然, 还需要在AndroidManifest中定义.
原文链接: http://blog.csdn.net/ostrichmyself/article/details/5662355
Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】
Activating components: intents【组件激活】
这里提到的Intent,类似于Content Provider,也是用户消息传递的, 但两者存在区别:
当一个从ContentResolver的请求的目标是Content Provider时,这个content Provider被激活。 前面提到的其他三种组件(Activity,Service, broadcast receiver)是通过被称为Intent的异步消息被激活的。 而ContentProvider仅仅是应用程序之间进行数据的访问, 如果一个应用程序的数据需要公布给其它程序访问, 那么就设定一个ContentProvider.
Intent对象持有异步消息, 对于Activity, 除了其他事情,Intent特别指定需要激活的Activity名称;对于Service,除了其他事情,Intent特别指定需要操作数据的URI。例 如,传递一个请求,让一个Activity为用户呈现一个图片,或者让用户编辑某个文本。 对于broadcast receiver而言, Intent对象指定需要通知的action名称。比如当相机的按钮按下去后,可以通知应用程序中,对此有兴趣组件。
激活不同的组件,存在不同的方法:
Activity: Activity 的启动时通过传递一个intent对象到Context.startActivity() 或者 Activity.startActivityForResult(). 这样,响应的Activity就启动了,响应的Activity 可以通过getIntent()方法查看让它启动的Intent中的内容。 响应的Activity 调用onNewIntent()方法,传递就可以获取传递过来的Intent。
前一个Activity经常启动下一个Activity, 如果前一个Activity需要下一个Activity的结果,则前一个Activity可以调用startActivityForResult() 而不是调用startActivity(). 例如, 如果启动了一个Activity,让用户选择一个图片。则可以返回选择的这幅图片。前一个Activity通过调用方法 onActivityResult()方法,从Intent对象中获得返回结果。
Service:Service的启动是通过传递一个Intent对象到Context.startService()中,Android调用Service的onStart()方法,传递这个对象。同样地,Intent对象可以传递给Context.bindService(),从而确定发起调用的组件和目标Service之间,即将确立的通信。 Service通过调用onBind()方法,接收Intent对象。(如果Service还未启动,bindService可以选择启动 Service). 比如某个Activity确定和音乐播放的Service关联,这样这个Activity就可以为用户提供一个UI去控制播放。这个Activity可以 调用bindService()建立这个连接, 然后service中定义的方法,从而控制播放。
后续章节中, Remote procedure calls,将提到更多关于bind service的细节。
broadcast: 应用启动一个broadcast, 可以通过传递intent给这些方法,如Context.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()以及这些方法的变种。Android传递这些Intent给所有感兴趣的broadcast receiver, 是通过调用broadcast 的onReceiver()方法。
更多Intent的信息,请查看独立的章节Intents and Intent Filters
原文链接: http://blog.csdn.net/ostrichmyself/article/details/5665072
今天的关于Android SDK Content Loader遇到问题. parseSdkContent失败和android sdk path not specified的分享已经结束,谢谢您的关注,如果想了解更多关于Android ContentProvider+ContentObserver、Android sdk content loader 0% 的解决方案、Android SDK Document 框架导读的翻译和注解[5]——Content provider、Android SDK Document 框架导读的翻译和注解[6]——Activating components: intents【用Intent激活组件】的相关知识,请在本站进行查询。
本文标签: