Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用cursorloader启动时应用程序崩溃_Android_Android Cursorloader - Fatal编程技术网

Android 使用cursorloader启动时应用程序崩溃

Android 使用cursorloader启动时应用程序崩溃,android,android-cursorloader,Android,Android Cursorloader,应用程序在第一次启动时崩溃,并在使用CursorLoader回调方法时给我这些错误(在此之前,我在主UI中加载DB表,在这种情况下不会发生任何事情,但当更改为CursorLoader以加载并更改后台UI时,出现了此问题),我不知道是哪一行代码导致应用程序崩溃,但我认为导入有一手,请帮助 03-30 02:10:06.441 1564-1591/android.process.acore E/DatabaseUtils﹕ Writing exception to parcel

应用程序在第一次启动时崩溃,并在使用CursorLoader回调方法时给我这些错误(在此之前,我在主UI中加载DB表,在这种情况下不会发生任何事情,但当更改为CursorLoader以加载并更改后台UI时,出现了此问题),我不知道是哪一行代码导致应用程序崩溃,但我认为导入有一手,请帮助

   03-30 02:10:06.441    1564-1591/android.process.acore E/DatabaseUtils﹕   Writing exception to parcel
   java.lang.IllegalArgumentException: Invalid column name
        at    android.database.sqlite.SQLiteQueryBuilder.computeProjection(SQLiteQueryBuilder.java:632)
        at android.database.sqlite.SQLiteQueryBuilder.buildQuery(SQLiteQueryBuilder.java:447)
        at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:393)
        at com.android.providers.contacts.ContactsProvider2.query(ContactsProvider2.java:6493)
        at com.android.providers.contacts.ContactsProvider2.queryLocal(ContactsProvider2.java:6443)
        at com.android.providers.contacts.ContactsProvider2.query(ContactsProvider2.java:5038)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
        at android.os.Binder.execTransact(Binder.java:446)
03-30 02:10:06.446  24098-24122/com.example.android.pets E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.example.android.pets, PID: 24098
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
 Caused by: java.lang.IllegalArgumentException: Invalid column name
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
        at android.content.ContentResolver.query(ContentResolver.java:478)
        at android.content.CursorLoader.loadInBackground(CursorLoader.java:64)
        at android.content.CursorLoader.loadInBackground(CursorLoader.java:42)
        at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312)
        at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
        at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:57)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
这是指向上应用程序的整个链接,该应用程序创建宠物数据库并将这些宠物保存到数据库中,然后从数据库中检索它们,并使用listview通过游标Loader和游标适配器将检索到的数据显示到UI中 这是主要活动的代码

package com.example.android.pets;

import android.content.ContentValues;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import com.example.android.pets.data.PetContract;
import com.example.android.pets.data.PetDbHelper;


public class CatalogActivity extends AppCompatActivity implements     LoaderManager.LoaderCallbacks<Cursor> {
private static final int URI_LOADER = 0;
private PetDbHelper mDbHelper;
SQLiteDatabase db;
ListView lvItems;
PetCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_catalog);
 lvItems = (ListView) findViewById(R.id.lstview);
View emptyView = findViewById(R.id.empty_view);
lvItems.setEmptyView(emptyView);

adapter = new PetCursorAdapter(this, null);
lvItems.setAdapter(adapter);

// Setup FAB to open EditorActivity
FloatingActionButton fab = (FloatingActionButton)  findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(CatalogActivity.this,      EditorActivity.class);
        startActivity(intent);
    }
  });
mDbHelper = new PetDbHelper(this);
db=mDbHelper.getWritableDatabase();
getLoaderManager().initLoader(URI_LOADER, null, this);

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu options from the res/menu/menu_catalog.xml file.
 // This adds menu items to the app bar.
 getMenuInflater().inflate(R.menu.menu_catalog, menu);
 return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 // User clicked on a menu option in the app bar overflow menu
 switch (item.getItemId()) {
    // Respond to a click on the "Insert dummy data" menu option
    case R.id.action_insert_dummy_data:
        insertdummy();
        return true;
    // Respond to a click on the "Delete all entries" menu option
    case R.id.action_delete_all_entries:
        // Do nothing for now
        return true;
    }
  return super.onOptionsItemSelected(item);
  }

 private void insertdummy() {
 ContentValues values=new ContentValues();
 values.put(PetContract.PetEntry.COLUMN_PET_NAME, "toto");
 values.put(PetContract.PetEntry.COLUMN_PET_BREED,"terrier");
 values.put(PetContract.PetEntry.COLUMN_PET_GENDER,     PetContract.PetEntry.GENDER_MALE);
 values.put(PetContract.PetEntry.COLUMN_PET_WEIGHT, 7);
 Uri URI_ID=   getContentResolver().insert(PetContract.PetEntry.CONTENT_URI, values);
 if(URI_ID==null)
  Toast.makeText(getApplicationContext(),  R.string.fail_save,Toast.LENGTH_LONG).show();
 else
    Toast.makeText(getApplicationContext(), R.string.success_save,   Toast.LENGTH_LONG).show();

  }

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
String[] projection = {PetContract.PetEntry._ID,
        PetContract.PetEntry.COLUMN_PET_NAME,
        PetContract.PetEntry.COLUMN_PET_BREED};
String selection = null;
String selectionArgs[] =null;
return new CursorLoader(getApplicationContext(),     ContactsContract.Data.CONTENT_URI,
        projection, selection, selectionArgs, null);
 }

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
 }
 }
package com.example.android.pets;
导入android.content.ContentValues;
导入android.app.LoaderManager;
导入android.content.CursorLoader;
导入android.content.Loader;
导入android.content.Intent;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
导入android.net.Uri;
导入android.os.Bundle;
导入android.provider.contacts合同;
导入android.support.design.widget.FloatingActionButton;
导入android.support.v7.app.AppActivity;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.ListView;
导入android.widget.Toast;
导入com.example.android.pets.data.PetContract;
导入com.example.android.pets.data.PetDbHelper;
公共类CatalogActivity扩展AppCompatActivity实现LoaderManager.LoaderCallbacks{
私有静态final int URI_LOADER=0;
私人宠物助手;
sqlitedb数据库;
列表视图项目;
PetCursorAdapter适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_目录);
lvItems=(ListView)findViewById(R.id.lstview);
视图emptyView=findViewById(R.id.empty\u视图);
lvItems.setEmptyView(emptyView);
适配器=新的PetCursorAdapter(此为空);
lvItems.setAdapter(适配器);
//设置FAB以打开编辑器活动
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
意向意向=新意向(CatalogActivity.this、EditorActivity.class);
星触觉(意向);
}
});
mDbHelper=新的PetDbHelper(此);
db=mDbHelper.getWritableDatabase();
getLoaderManager().initLoader(URI_LOADER,null,this);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//从res/menu/menu_catalog.xml文件中展开菜单选项。
//这会将菜单项添加到应用程序栏。
getMenuInflater().充气(R.menu.menu\u目录,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//用户单击了应用程序栏溢出菜单中的菜单选项
开关(item.getItemId()){
//对点击“插入虚拟数据”菜单选项作出响应
案例R.id.action\u insert\u dummy\u数据:
insertdummy();
返回true;
//对单击“删除所有条目”菜单选项作出响应
案例R.id.action\u删除\u所有\u条目:
//现在什么都不要做
返回true;
}
返回super.onOptionsItemSelected(项目);
}
私有void insertdummy(){
ContentValues=新的ContentValues();
value.put(PetContract.PetEntry.COLUMN_PET_NAME,“toto”);
价值观.put(PetContract.PetEntry.COLUMN_PET_BREED,“terrier”);
values.put(PetContract.PetEntry.COLUMN_PET_GENDER,PetContract.PetEntry.GENDER_MALE);
值。放置(PetContract.PetEntry.COLUMN_PET_WEIGHT,7);
Uri Uri_ID=getContentResolver().insert(PetContract.PetEntry.CONTENT_Uri,值);
if(URI_ID==null)
Toast.makeText(getApplicationContext(),R.string.fail\u save,Toast.LENGTH\u LONG.show();
其他的
Toast.makeText(getApplicationContext(),R.string.success\u save,Toast.LENGTH\u LONG.show();
}
@凌驾
公共加载器onCreateLoader(inti,Bundle){
字符串[]投影={PetContract.PetEntry.\u ID,
PetContract.PetEntry.COLUMN\u PET\u NAME,
PetContract.PetEntry.COLUMN_PET_break};
字符串选择=null;
字符串selectionArgs[]=null;
返回新的游标装入器(getApplicationContext(),contacts contract.Data.CONTENT\u URI,
投影、选择、选择标记、空);
}
@凌驾
public void onLoadFinished(加载器,光标){
适配器.swapCursor(游标);
}
@凌驾
公共void onLoaderReset(加载器){
适配器.swapCursor(空);
}
}

我认为您必须在这里使用PetContract

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    String[] projection = {PetContract.PetEntry._ID,
    PetContract.PetEntry.COLUMN_PET_NAME,PetContract.PetEntry.COLUMN_PET_BREED};
    String selection = null;
    String selectionArgs[] =null;
    return new CursorLoader(this, PetContract.CONTENT_URI,
    projection, selection, selectionArgs, null);
}
@覆盖
公共加载器onCreateLoader(inti,Bundle){
字符串[]投影={PetContract.PetEntry.\u ID,
PetContract.PetEntry.COLUMN_PET_NAME,PetContract.PetEntry.COLUMN_PET_break};
字符串选择=null;
字符串selectionArgs[]=null;
返回新的游标装入器(此,PetContract.CONTENT\u URI,
投影、选择、选择标记、空);
}

我还将getApplicationContext()更改为this,以获取活动上下文。我不确定,但这就是我在装载机上做的。尝试一下,看看它是否有效,但我认为主要的错误在于合同部分。

是否可以包括合同类和助手类?错误似乎与您的列有关。这是一个指向完整结构的整个应用程序的链接问题非常大,无法读取,我认为错误出现在mainactivity中,因为它在主UI中加载db数据时工作正常,但在尝试使用CursorLoader加载数据时,使其崩溃Hanks问题出在这一行PetContract.CONTENT\u URI中