2016-03-29 6 views
2

私はアンドロイドを初めて使うので、私は友人とオンラインで見つけたいくつかのチュートリアルの助けを借りて自分のタブアクティビティを実装しました。しかし、次のタブに移動しようとすると、エラーがスローされます。私はそれを見て、何が起こっているのか、私がここで間違っているのか理解できません。フラグメントにナビゲートするとアプリケーションがクラッシュする

これは私の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 [email protected] that was originally added here 
    android.view.WindowLeaked: Activity com.xxxxxx.eventmanager.EventDetailsActivity has leaked window [email protected] 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

このエラーは、次の理由で発生しています。

特に
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) 

、ライン129:この列は

c.getString(c.getColumnIndex("venue_name")), 

存在していますか?それは文字列ですか?

私はこのような列は存在しないと言います。確かに、列が存在しない場合のドキュメント、getColumnIndex -1を返すに応じて:

は、指定した列名の0から始まるインデックスを返し列が存在しない場合。列が存在すると予想される場合は、代わりにgetColumnIndexOrThrow(String)を使用します。これにより、エラーがより明確になります。あなたがget()方法 変更に非既存の列名を使用している

+0

ありがとうございました!私はそれをまったく気付かなかった!しかし、なぜSQLiteは私に "Column Not Found"のようなデータベース固有のエラーを与えませんか?なぜ私の活動ウィンドウが漏れているのかを調べるのに多くの時間を費やしました。 – user3718908

+1

データベースを処理するために低レベルのAPIを使用しているため、何をしているのかを知っていなければなりません。ドキュメントが示唆するように、getColumnIndexOrThrowを使用できました。上から始まる常に完全なスタックトレースを読む – Markon

1

-

c.getString(c.getColumnIndex("vendor_name")), 
によって

c.getString(c.getColumnIndex("venue_name")), 

を注:常にに定数を使用するタイプミス、エラーのこれらの種類を避けるために列名を格納し、それらの定数をデータベース操作に使用します。

+0

既存の回答をコピーすることについてのポイントは何ですか? – Markon

+0

すみません。私は誰の答えもコピーしなかった。あなたの答えをあなたが作っている間に起こったかもしれません。 –

+0

大丈夫です。それは起こる。 – Markon

関連する問題