导航到片段时应用程序崩溃

时间:2016-03-29 18:45:46

标签: android

我是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>();
    }
}

2 个答案:

答案 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")),

注意:为避免这些类型的拼写错误,请始终使用常量来存储列名,并在数据库操作中使用这些常量。