我是android的新手,我在朋友的帮助下实现了我的Tab Activity活动,并在网上找到了几个教程。但是,当我尝试导航到下一个选项卡时,会引发错误。我仔细研究过,无法理解发生了什么或者我在这里做错了什么。
这是我的Android监视器中显示的错误:
03-29 19:20:55.958 1544-1544/com.xxxxxx.eventmanager E/Trace: error opening trace file: No such file or directory (2)
03-29 19:36:25.011 1544-19421/com.xxxxxx.eventmanager E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 199 rows, 18 columns.
03-29 19:36:25.031 1544-19421/com.xxxxxx.eventmanager E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:434)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at com.xxxxxx.eventmanager.models.InvoiceModel.get(InvoiceModel.java:129)
at com.xxxxxx.eventmanager.fragments.EventPurchasesFragment$InvoiceAsync.doInBackground(EventPurchasesFragment.java:132)
at com.xxxxxx.eventmanager.fragments.EventPurchasesFragment$InvoiceAsync.doInBackground(EventPurchasesFragment.java:106)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
03-29 19:36:25.981 1544-1544/com.xxxxxx.eventmanager E/WindowManager: Activity com.xxxxxx.eventmanager.EventDetailsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@b13069f8 that was originally added here
android.view.WindowLeaked: Activity com.xxxxxx.eventmanager.EventDetailsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@b13069f8 that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
at android.view.Window$LocalWindowManager.addView(Window.java:547)
at android.app.Dialog.show(Dialog.java:277)
at com.xxxxxx.eventmanager.fragments.EventPurchasesFragment$InvoiceAsync.onPreExecute(EventPurchasesFragment.java:122)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
at com.xxxxxx.eventmanager.fragments.EventPurchasesFragment.onStart(EventPurchasesFragment.java:69)
at android.support.v4.app.Fragment.performStart(Fragment.java:2000)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102)
at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:926)
at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1276)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1634)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:164)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1177)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:608)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:570)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:551)
at com.xxxxxx.eventmanager.EventDetailsActivity$1.onTabSelected(EventDetailsActivity.java:57)
at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1024)
at android.support.design.widget.TabLayout.selectTab(TabLayout.java:994)
at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1262)
at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1360)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
这是我片段的活动:
package com.xxxxxx.eventmanager.fragments;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.xxxxxx.eventmanager.EventDetailsActivity;
import com.xxxxxx.eventmanager.R;
import com.xxxxxx.eventmanager.adapters.InvoiceBaseAdapter;
import com.xxxxxx.eventmanager.models.InvoiceModel;
import com.xxxxxx.eventmanager.objects.Invoice;
import java.util.ArrayList;
import java.util.List;
/**
* Created by djoks on 22/03/2016.
*/
public class EventPurchasesFragment extends Fragment {
// Shared Preferences
SharedPreferences settings;
Context context;
View view;
InvoiceModel im;
//Array Adapter that will hold our ArrayList and display the items on the ListView
InvoiceBaseAdapter adapter;
List<Invoice> il;
ListView invoiceListView;
Invoice io;
InvoiceBroadcastReceiver receiver;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_event_purchases, container, false);
this.context = container.getContext();
this.im = new InvoiceModel(context);
this.io = new Invoice();
return view;
}
@Override
public void onStart() {
super.onStart();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
new InvoiceAsync().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
}else{
new InvoiceAsync().execute();
}
invoiceListView = (ListView) view.findViewById(R.id.invoiceListView);
invoiceListView.setFocusable(false);
invoiceListView.setClickable(true);
invoiceListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/*TextView eventIdView = (TextView) view.findViewById(R.id.eventIdView);
int eventId = Integer.parseInt(eventIdView.getText().toString());
Intent i = new Intent(context, EventDetailsActivity.class);
i.putExtra("eventId", eventId);
startActivity(i);*/
}
});
}
@Override
public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter("com.xxxxxx.eventmanager.UPDATE_INVOICE_DATASOURCE");
receiver = new InvoiceBroadcastReceiver();
context.registerReceiver(receiver, filter);
}
@Override
public void onPause() {
super.onPause();
context.unregisterReceiver(receiver);
}
private class InvoiceAsync extends AsyncTask<Void, Void, ArrayList<Invoice>> {
ProgressDialog pd;
InvoiceModel im;
String msg = "";
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
if (pd == null) {
pd = new ProgressDialog(context);
pd.setMessage("Loading Invoices");
pd.setIndeterminate(true);
pd.setCancelable(true);
pd.setCanceledOnTouchOutside(false);
pd.show();
}
}
@Override
protected ArrayList<Invoice> doInBackground(Void... params) {
// TODO Auto-generated method stub
InvoiceModel im = new InvoiceModel(context);
return im.get();
}
@Override
protected void onPostExecute(ArrayList<Invoice> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(pd.isShowing()){
pd.dismiss();
}
if(result !=null && result.size() > 0){
adapter = new InvoiceBaseAdapter(context, result);
invoiceListView.setAdapter(adapter);
invoiceListView.setTextFilterEnabled(true);
adapter.notifyDataSetChanged();
} else {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
}
private class InvoiceBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
new InvoiceAsync().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
}else{
new InvoiceAsync().execute();
}
}
}
}
这是我处理SQLiteDatabase事务的模型:
package com.xxxxxx.eventmanager.models;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.xxxxxx.eventmanager.database.LocalDBDataSource;
import com.xxxxxx.eventmanager.objects.Event;
import com.xxxxxx.eventmanager.objects.Invoice;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
/**
* Created by djoks on 28/03/2016.
*/
public class InvoiceModel {
Context context;
SQLiteDatabase db;
SharedPreferences settings;
AppModel app;
public InvoiceModel(Context c) {
super();
this.context = c;
this.settings = c.getSharedPreferences("App", context.MODE_PRIVATE);
this.app = new AppModel(c);
}
private void insert(Invoice i) {
ContentValues cv = new ContentValues();
cv.put("invoice_id", i.getInvoiceId());
cv.put("type", i.getType());
cv.put("vendor_id", i.getVendorId());
cv.put("vendor_name", i.getVendorName());
cv.put("reference_code", i.getReferenceCode());
cv.put("total_no_of_tickets", i.getTotalNoOfTickets());
cv.put("total_tickets_amount", i.getTotalTicketsAmount());
cv.put("total_extras_amount", i.getTotalExtrasAmount());
cv.put("total_amount_billed", i.getTotalAmountBilled());
cv.put("total_charges_applied", i.getTotalChargesApplied());
cv.put("total_discounts_applied", i.getTotalDiscountsApplied());
cv.put("customer", i.getCustomerDetails().toString());
cv.put("tickets", i.getTicketsPurchased().toString());
cv.put("extras", i.getExtrasPurchased().toString());
cv.put("created_at", i.getCreatedAt());
cv.put("updated_at", i.getUpdatedAt());
cv.put("deleted_at", i.getDeletedAt());
db.insert("invoices", null, cv);
}
private void update(Invoice i){
String whereClause = "invoice_id = ?";
String[] whereParams = {String.valueOf(i.getInvoiceId())};
ContentValues cv = new ContentValues();
cv.put("invoice_id", i.getInvoiceId());
cv.put("type", i.getType());
cv.put("vendor_id", i.getVendorId());
cv.put("vendor_name", i.getVendorName());
cv.put("reference_code", i.getReferenceCode());
cv.put("total_no_of_tickets", i.getTotalNoOfTickets());
cv.put("total_tickets_amount", i.getTotalTicketsAmount());
cv.put("total_extras_amount", i.getTotalExtrasAmount());
cv.put("total_amount_billed", i.getTotalAmountBilled());
cv.put("total_charges_applied", i.getTotalChargesApplied());
cv.put("total_discounts_applied", i.getTotalDiscountsApplied());
cv.put("customer", i.getCustomerDetails().toString());
cv.put("tickets", i.getTicketsPurchased().toString());
cv.put("extras", i.getExtrasPurchased().toString());
cv.put("created_at", i.getCreatedAt());
cv.put("updated_at", i.getUpdatedAt());
cv.put("deleted_at", i.getDeletedAt());
db.update("invoices", cv, whereClause, whereParams);
}
public void save(Invoice i) {
db = LocalDBDataSource.getHelper(context).getWritableDatabase();
String whereClause = "invoice_id = ?";
String[] whereParams = {String.valueOf(i.getInvoiceId())};
String[] columns = {"*"};
Cursor c = null;
try{
c = db.query("invoices", columns, whereClause, whereParams, null, null, null);
if(c.getCount() > 0)
{
update(i);
} else{
insert(i);
}
} finally {
if(c != null && !c.isClosed()){
c.close();
}
if(db != null && db.isOpen()){
db.close();
}
}
}
public ArrayList<Invoice> get() {
db = LocalDBDataSource.getHelper(context).getWritableDatabase();
Cursor c = null;
String[] columns = {"*"};
ArrayList<Invoice> invoices = new ArrayList<Invoice>();
try{
c = db.query(false, "invoices", columns, null, null, null, null, null, null);
if(c.getCount() > 0){
while(c.moveToNext()){
invoices.add(new Invoice(
c.getInt(c.getColumnIndex("invoice_id")),
c.getString(c.getColumnIndex("type")),
c.getInt(c.getColumnIndex("vendor_id")),
c.getString(c.getColumnIndex("venue_name")),
c.getString(c.getColumnIndex("reference_code")),
c.getInt(c.getColumnIndex("total_no_of_tickets")),
c.getFloat(c.getColumnIndex("total_tickets_amount")),
c.getFloat(c.getColumnIndex("total_extras_amount")),
c.getFloat(c.getColumnIndex("total_amount_billed")),
c.getFloat(c.getColumnIndex("total_charges_applied")),
c.getFloat(c.getColumnIndex("total_discounts_applied")),
new JSONObject(c.getString(c.getColumnIndex("customer"))),
new JSONArray(c.getString(c.getColumnIndex("tickets"))),
new JSONArray(c.getString(c.getColumnIndex("extras"))),
c.getString(c.getColumnIndex("created_at")),
c.getString(c.getColumnIndex("updated_at")),
c.getString(c.getColumnIndex("deleted_at"))
));
}
}
} catch (JSONException e) {
e.printStackTrace();
} finally{
if (c !=null && !c.isClosed()) {
c.close();
}
if(db!=null && db.isOpen()) {
db.close();
}
}
return invoices.size() > 0 ? invoices : new ArrayList<Invoice>();
}
}
答案 0 :(得分:2)
错误是由此引起的:
let filteredUserItems = userItems.filter { return $0.displayName.lowercaseString.containsString(searchValue.lowercaseString) }
特别是第129行:
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.
Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:434)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at com.xxxxxx.eventmanager.models.InvoiceModel.get(InvoiceModel.java:129)
此列是否存在?它是一个字符串?
我会说这样的专栏不存在。实际上,根据文档,getColumnIndex在列不存在时返回-1:
返回给定列名的从零开始的索引,如果列不存在,则返回-1。如果您希望该列存在,请使用getColumnIndexOrThrow(String),这将使错误更加清晰。
答案 1 :(得分:1)
您在get()
方法中使用了不存在的列名
改变 -
c.getString(c.getColumnIndex("venue_name")),
通过
c.getString(c.getColumnIndex("vendor_name")),
注意:为避免这些类型的拼写错误,请始终使用常量来存储列名,并在数据库操作中使用这些常量。