在最近更新的Android开发指南中,内容提供商的文档包含标题为合同类的部分.虽然有一个指向联系人示例的链接,但目前还不清楚什么是合同类,以及如何为我的自定义内容提供商创建一个
希望得到一些帮助.
谢谢!
我开始使用Dagger设置依赖注入,如下所示.因为我可能有错误,所以请鼓励我更正我的实施!该实现遵循项目提供的android-simple示例.在下面你可以看到我是如何成功添加依赖注入Activities和Fragments.我现在试着保持简单,所以我决定将Timber注入Android的log util的记录器替换.
import android.app.Application;
import java.util.Arrays;
import java.util.List;
import dagger.ObjectGraph;
import com.example.debugging.LoggingModule;
public class ExampleApplication extends Application {
    private ObjectGraph mObjectGraph;
    protected List<Object> getModules() {
        return Arrays.asList(
                new AndroidModule(this),
                new ExampleModule(),
                new LoggingModule()
        );
    }
    private void createObjectGraphIfNeeded() {
        if (mObjectGraph == null) {
            Object[] modules = getModules().toArray();
            mObjectGraph = ObjectGraph.create(modules);
        }
    }
    public void inject(Object object) {
        createObjectGraphIfNeeded();
        mObjectGraph.inject(object);
    }
}
到现在AndroidModule没有任何地方使用,但可能会有所帮助时,Context并LayoutInflater …
android dependency-injection android-contentprovider android-asynctask dagger
我有一个Android应用程序,维护不同地理位置的本地SQLite数据库.
现在我想将该数据库连接到"云"以完成以下操作:
首次安装应用程序时(或根据要求)初始下载所有内容
已在本地添加的新位置应上传到云端(自动)
应偶尔检查在线数据库的新在线条目,并下载到本地数据库.
我有很多问题要做到这一点.
首先是如何做到这一点.我认为它涉及contentProviders和syncProviders,但我不确定如何.我是否需要在contentProvider中复制我的SQLite数据库,或者我是否在底层设计中犯了错误,直接使用数据库,而不是通过自定义内容提供程序?
其次,位置记录不能简单地从在线数据库中上下复制,因为它们将具有冲突的ID号.我有几个关系表,例如"tag",它将tag-id与location-id相关联.我的tag-id不一定与其他用户tag-id匹配.与位置ID相同.因此,需要在转移中涉及一些逻辑. 应该在哪里/如何妥善处理?那是contentResolver的角色吗?(不确定那是什么)
第三,在2个用户同时添加相同位置(可能具有不同的描述和细节)的情况下会发生什么? 是否有合并这些记录的最佳做法?
最后,构建/托管在线组件的最简单方法是什么? 这部分对我来说都是新的.我可以将master数据库放在公共Dropbox文件夹中,还是需要从头开始构建自定义php web-app?或者是否有预先打包的解决方案可以使这部分更容易?
database cloud android synchronization android-contentprovider
ContentValues类包含一个允许将布尔值放入值集合的方法.AFAIK,SQLite不包含Android可以将布尔值推入的本机布尔格式.那么,Android在幕后存储这些值的魔力是什么?
另外,为什么Cursor上没有免费的getBoolean方法?对我来说,这似乎是一个非常尴尬的设计疏忽,因为似乎没有"安全"的方法来检索通过ContentValues放入DB的布尔值.我错过了什么?
这个问题可能看起来有点无聊,因为我怀疑布尔值是存储为1或0整数,但为什么Android会向开发人员提出这个假设呢?据我所知,它甚至没有记录.
所以我有我的MainDisplayActivity两个Activity和LoaderManager.LoaderCallbacks<Cursor>.在这里,我有一个A ListView,我填写了我使用ContentProvider从我的数据库获得的议程信息.我也有GridView一个日历.我点击一个单元格时设置了它,在点击的那一天更新议程.我的问题是,当重用我在onCreate()setOnItemClickListener()内部创建的Loader时,它不会使用我正在创建的新游标刷新信息.我可以用另一个ID创建一个新的Loader,它可以运行一次,但是一旦我点击另一天,它就会停止刷新.问题在于光标.如何从Loader刷新游标,这样我就不必继续创建新的Loader?提前致谢!
初始调用在My MainDisplayActivity类中的onCreate()中创建Loader :
makeProviderBundle(new String[] {"_id, event_name, start_date, start_time, end_date, end_time, location"},
            "date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null);
    getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);
    list.setAdapter(agendaAdapter);
这些是被重写的方法 LoaderCallbacks<Cursor>
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Uri baseUri = SmartCalProvider.CONTENT_URI;
    return new CursorLoader(this, baseUri, args.getStringArray("projection"), 
            args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null );
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    agendaAdapter.swapCursor(arg1);
}
@Override …debugging android android-contentprovider android-loadermanager android-cursorloader
我想知道是否有办法知道呼叫的内容提供商是否已经改变.我的意思是,如果我拨打电话,或者我接听电话,它会返回一个"标志",表示已将新日志添加到呼叫日志中,或者Android存储有关呼叫的信息的位置.
因为,当我拨打电话时,Android会在内容提供商中存储号码,联系人姓名(如果存在),通话时间,持续时间等等.那么有没有办法捕获这个"标志",表示呼叫的内容提供商更大,我的意思是,在内容提供商CallLog.Calls上插入了新数据.
所以,我仍然对这个问题有很多怀疑.我不知道在哪里注册内容观察者.我的意图是,当CallLog内容提供程序中的某些内容发生更改时,将使用代码的insert方法.
我的意思是,除非将新数据添加到CallLog内容提供程序,否则代码将不会执行任何操作.如果已将某些数据添加到CallLog内容提供程序,则代码将查询新数据,然后将插入.我想这样做,因为没有内容观察者,应用程序在每次运行应用程序时已经插入的数据库中插入数据,得到了吗?
所以这是我的代码.如果有人可以告诉我放在哪里registerContentObserver()以及其他所需的东西.
public class RatedCalls extends ListActivity {
    private SQLiteDatabase db;
    private CallDataHelper dh = null;
    StringBuilder sb = new StringBuilder();
    OpenHelper openHelper = new OpenHelper(RatedCalls.this);
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Cursor cursor = getContentResolver().query(
                android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
                android.provider.CallLog.Calls.DATE + " DESC ");
        dh = new CallDataHelper(this);
        db = openHelper.getWritableDatabase();
        startManagingCursor(cursor);
        int numberColumnId = cursor.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
        int durationId = cursor.getColumnIndex(android.provider.CallLog.Calls.DURATION);
        int contactNameId = cursor.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
        int dateId = cursor.getColumnIndex(android.provider.CallLog.Calls.DATE);
        int numTypeId = cursor.getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);
        Date dt …我正在编写一个与RESTful服务接口的Android应用程序.此Web服务基本上是文件系统的前端,并提供元数据以及对文件的CRUD访问.我的应用程序检索元数据,并通过a将其公开给第三方应用程序ContentProvider.  
我需要添加第三方应用程序的能力,在与我的应用程序相同的设备上运行,通过向我的应用程序发送请求(而不是直接与服务器)来CRUD实际文件.这意味着他们需要通过我的应用程序发送或接收文件的内容(通常是XML或图像).
我想到了实现这个的两种方法:
这似乎是让第三方应用程序能够从我的文件中读取文件的明显选择ContentProvider.我认为当这些应用程序需要通过我的`ContentProvider'创建或更新文件时,它开始变得棘手.完成后我需要回调才能知道何时将新的/更改的文件发送回服务器.我相信我可以为此目的使用FileObserver.
通过这种方法,我可以通过应用程序和客户端应用程序之间的文件发送Messenger.该文件必须通过一个传递Bundle,所以我不知道什么是最好的格式是发送它们(File,FileDescriptor,字节数组,别的东西?).如果文件变得很大,我不能很好地处理这会导致问题.  
Messenger/ 传递CRUD请求和删除框内容ServiceContentProvider来存储请求的状态ContentObserver我认为使用ContentProvider将是理想的解决方案,但似乎API并不完全支持我的用例.我担心尝试沿着这条路走下去可能会导致一个愚蠢的实施.如果我采用Messenger和Service接近,我不确定通过a传输文件的最强大的方法Bundle.
混合方法似乎非常强大,但实现起来最复杂.文件实际上并没有被传递,因此性能应该很好.但是,我担心这会过度设计解决方案.
在同一Android设备上运行的应用程序之间传输文件的最佳方法是什么? 当然,我对我在问题中没有概述的其他选项持开放态度.
目前,我使用以下语句在Android设备上的SQLite数据库中创建表.
CREATE TABLE IF NOT EXISTS 'locations' (
  '_id' INTEGER PRIMARY KEY AUTOINCREMENT, 'name' TEXT, 
  'latitude' REAL, 'longitude' REAL, 
  UNIQUE ( 'latitude',  'longitude' ) 
ON CONFLICT REPLACE );
最后的conflict-clause导致在完成具有相同坐标的新插入时删除行.在SQLite的文档包含有关冲突条款的进一步信息.
相反,我想保留前面的行,只是更新他们的列.在Android/SQLite环境中执行此操作的最有效方法是什么?
CREATE TABLE声明中的冲突条款.INSERT触发器.ContentProvider#insert.我认为在数据库中处理此类冲突更具性能.此外,我发现很难重写该ContentProvider#insert方法以考虑插入更新方案.这是insert方法的代码:
public Uri insert(Uri uri, ContentValues values) {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    long id = db.insert(DatabaseProperties.TABLE_NAME, null, values);
    return ContentUris.withAppendedId(uri, id);
}
当数据从后端到达时,我所做的就是按如下方式插入数据.
getContentResolver.insert(CustomContract.Locations.CONTENT_URI, …我正在查询CallLog内容提供程序,需要检测列类型.
在Honeycomb和更新版本(API Level 11+)中,您可以通过调用Cursor.getType(int columnIndex)返回以下类型之一的方法获取列首选数据类型:
如何在Honeycomb <11设备上实现这一目标?
我尝试过以下方法:
for ( int i = 0; i < cursor.getColumnCount(); i++ ) {    
    int columnType = -1;
    try {
        cursor.getInt( i );
        columnType = Cursor.FIELD_TYPE_INTEGER;
    } catch ( Exception ignore ) {
        try {
            cursor.getString( i );
            columnType = Cursor.FIELD_TYPE_STRING;
        } catch ( Exception ignore1 ) {
            try {
                cursor.getFloat( i );
                columnType = Cursor.FIELD_TYPE_FLOAT;
            } catch ( Exception ignore2 ) {
                try {                                             
                  cursor.getBlob( i …我在getType()方法中放入了一个永远不会被打印的日志.我正在使用记事本示例代码.请解释Java doc评论的第1行.从getType()返回null也正常工作.getType()方法的目的是什么?
    /**
 * This is called when a client calls {@link android.content.ContentResolver#getType(Uri)}.
 * Returns the MIME data type of the URI given as a parameter.
 * 
 * @param uri The URI whose MIME type is desired.
 * @return The MIME type of the URI.
 * @throws IllegalArgumentException if the incoming URI pattern is invalid.
 */
@Override
public String getType(Uri uri)
{
    Log.d("Suparna", "******getType()");
    /*switch(uriMatcher.match(uri))
    {
    // ---get all books---
    case BOOK_DETAILS:
        return Book.Book_Details.CONTENT_TYPE;
        // ---get a particular book---
    case …