Reputation: 8509
I am new to android, I implemented my Tab Activity activity with the help of a friend and several tutorials I found online. However when I try to navigate to the next tab an error is thrown. I have looked through it and cannot understand what is going on or what I am doing wrong here.
This is the error displayed in my Android monitor:
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)
This is my fragment's activity:
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();
}
}
}
}
This is my model where I handle SQLiteDatabase transactions:
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>();
}
}
Upvotes: 2
Views: 267
Reputation: 4600
The error is caused by this:
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)
In particular, line 129:
c.getString(c.getColumnIndex("venue_name")),
Does this column exist? Is it a string?
I would say that such column does not exist. Indeed, according to the documentation, getColumnIndex returns -1 when the column does not exist:
Returns the zero-based index for the given column name, or -1 if the column doesn't exist. If you expect the column to exist use getColumnIndexOrThrow(String) instead, which will make the error more clear.
Upvotes: 2
Reputation: 7070
You are using non-existing column name in get()
method
Change -
c.getString(c.getColumnIndex("venue_name")),
by
c.getString(c.getColumnIndex("vendor_name")),
Note : To avoid these type of typo errors always use the constants to store your column names and use those constants in your database operations.
Upvotes: 1