падение Android при попытке получить extras.getLong - PullRequest
0 голосов
/ 13 декабря 2011

Я часами пытался понять, почему андроид падает после загрузки профиля. Строка, которая вызывает проблему:

mRowId = extras != null ? extras.getLong(OverLimitDbAdapter.KEY_ROWID): null;

находится в Profile.java. поэтому у меня во-первых

OvertheLimit.java, который помещает дополнения в меню с намерением:

package uk.co.obdesign.android.overthelimit;


import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.RadioButton;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class Overthelimit extends ListActivity {
    private OverLimitDbAdapter dbHelper;
    private static final int USER_CREATE = 0;
    private static final int USER_EDIT = 1;
    private Cursor cursor;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.getListView();
        dbHelper = new OverLimitDbAdapter(this);
        dbHelper.open();
        fillData();
        registerForContextMenu(getListView());
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        fillData();

    }
    private void fillData() {
        cursor = dbHelper.fetchAllUserDrinks();
        startManagingCursor(cursor);


        String[] from = new String[] { OverLimitDbAdapter.KEY_USERNAME };
        int[] to = new int[] { R.id.label };

        // Now create an array adapter and set it to display using our row
        SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
                R.layout.user_row, cursor, from, to);
        setListAdapter(notes);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        return true;
    } 

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
        case R.id.profile:
            Intent myIntent1 = new Intent(Overthelimit.this, Profile.class);
            myIntent1.putExtra(OverLimitDbAdapter.KEY_ROWID, cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)));
            startActivityForResult(myIntent1, 0);
            return true;
        case R.id.myusual:
            Intent myIntent2 = new Intent(Overthelimit.this, MyUsual.class);
            startActivityForResult(myIntent2, 0);
            return true;
        case R.id.trackme:
            Intent myIntent3 = new Intent(Overthelimit.this, TrackMe.class);
            startActivityForResult(myIntent3, 0);
            return true;
        case R.id.moreinfo:
            Intent myIntent4 = new Intent(Overthelimit.this, MoreInfo.class);
            startActivityForResult(myIntent4, 0);
            return true;


        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (dbHelper != null) {
            dbHelper.close();
        }
    }


}

, затем, выбрав опцию меню профиля, я попадаю в профиль, который вылетает при попытке получить дополнения. Я проверил данные, используя тост, и это там. есть идеи?

package uk.co.obdesign.android.overthelimit;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;


public class Profile extends Activity{
    private EditText mUserName;
    private RadioGroup mGender;
    private EditText mAge;
    private EditText mHeight;
    private EditText mWeight;
    private Spinner mDrinkerType;
    private Long mRowId;
    private OverLimitDbAdapter mDbHelper;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(final Bundle bundle) {
        super.onCreate(bundle);
        mDbHelper = new OverLimitDbAdapter(this);
        mDbHelper.open();
        setContentView(R.layout.profile);
        mUserName = (EditText) findViewById(R.id.userName);
        mAge = (EditText) findViewById(R.id.age);
        mHeight = (EditText) findViewById(R.id.height);
        mWeight = (EditText) findViewById(R.id.weight);
        mGender = (RadioGroup) findViewById(R.id.gender);


        mDrinkerType = (Spinner) findViewById(R.id.drinkerType);

        Button next = (Button) findViewById(R.id.NextUsualDrinks);


                mRowId = (bundle == null) ? null :
                    (Long) bundle.getSerializable(OverLimitDbAdapter.KEY_ROWID);
                if (mRowId == null) {
                    Bundle extras = getIntent().getExtras();
                    mRowId = extras != null ? extras.getLong(OverLimitDbAdapter.KEY_ROWID)
                                            : null;
                }


            populateFields();

            next.setOnClickListener(new View.OnClickListener() {
             public void onClick(View view) {   
                 setResult(RESULT_OK);
                    //finish();
                Intent myIntent = new Intent(view.getContext(), MyUsual.class);
                startActivityForResult(myIntent, 0);
            }

        });


    }
    private void populateFields() {
        if (mRowId != null) {
            Cursor todo = mDbHelper.fetchUserDrinks(mRowId);
            startManagingCursor(todo);

            mUserName.setText(todo.getString(todo
                    .getColumnIndexOrThrow(OverLimitDbAdapter.KEY_USERNAME)));
            String gender = todo.getString(todo
                    .getColumnIndexOrThrow(OverLimitDbAdapter.KEY_GENDER));


            // Returns an integer which represents the selected radio button's ID
             int selected = mGender.getCheckedRadioButtonId();

            // Gets a reference to our "selected" radio button
             RadioButton b = (RadioButton) findViewById(selected);

            // Now you can get the text or whatever you want from the "selected" radio button
             String bn = (String) b.getText();

             if (bn.equalsIgnoreCase(gender)) {
                 if(gender == "male") 
                            ((RadioButton) findViewById(R.id.male)).setChecked(true);
                 else if (gender == "female")
                            ((RadioButton) findViewById(R.id.female)).setChecked(true);


             }


            mAge.setText(todo.getString(todo
                    .getColumnIndexOrThrow(OverLimitDbAdapter.KEY_AGE)));
            mHeight.setText(todo.getString(todo
                    .getColumnIndexOrThrow(OverLimitDbAdapter.KEY_HEIGHT)));
            mWeight.setText(todo.getString(todo
                    .getColumnIndexOrThrow(OverLimitDbAdapter.KEY_WEIGHT)));
            String drinkerType = todo.getString(todo
                    .getColumnIndexOrThrow(OverLimitDbAdapter.KEY_TYPE));

            for (int i = 0; i < mDrinkerType.getCount(); i++) {

                String s = (String) mDrinkerType.getItemAtPosition(i);
                Log.e(null, s + " " + drinkerType);
                if (s.equalsIgnoreCase(drinkerType)) {
                    mDrinkerType.setSelection(i);
                }
            }
        }
    }

    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        saveState();
        outState.putSerializable(OverLimitDbAdapter.KEY_ROWID, mRowId);
    }

    @Override
    protected void onPause() {
        super.onPause();
        saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        populateFields();
    }

    private void saveState() {
        String username = mUserName.getText().toString();

        // Returns an integer which represents the selected radio button's ID
         int selected = mGender.getCheckedRadioButtonId();
        // Gets a reference to our "selected" radio button
         RadioButton b = (RadioButton) findViewById(selected);
        // Now you can get the text or whatever you want from the "selected" radio button
        String gender = (String) b.getText();

        String age = mAge.getText().toString();
        String height = mHeight.getText().toString();
        String weight = mWeight.getText().toString();
        String type = (String) mDrinkerType.getSelectedItem();

        if (mRowId == null) {
            long id = mDbHelper.createUserProfile(username, gender, age, height, weight, type);
            if (id > 0) {
                mRowId = id;
            }
        } else {
            mDbHelper.updateUserProfile(mRowId, username, gender, age, height, weight, type);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Скорее всего, ваша проблема в том, что вы добавляете String дополнительно (так как cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)) возвращает String) - но пытаетесь получить Long extra - который не вычисляется.

Следующее должно решить проблему:

mRowId = extras != null ? Long.parseLong( extras.getString(OverLimitDbAdapter.KEY_ROWID) ) : null;
1 голос
/ 13 декабря 2011

В вашем Overthelimit классе вы устанавливаете значение в следующей строке:

myIntent1.putExtra(OverLimitDbAdapter.KEY_ROWID, cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)));

Это помещает значение String в дополнительные функции. Попытка получить то же значение, что и значение Long , приведет к сбою приложений, так как оно не существует как значение Long. Если вместо этого вы преобразуете значение, полученное из объекта-курсора (или получит его непосредственно как Long из вашего курсора), ваше приложение больше не будет падать. В качестве альтернативы, вы можете получить свою ценность от намерений, используя getString(), а не getLong().

0 голосов
/ 13 декабря 2011

Я думаю, что это дает ошибку приведения типа, когда вы сохраняете значение в виде строки на входе, попробуйте набрать тип при задании значения времени или получить строку as, а затем преобразовать в длинное значение, но для приведения типа вы можете получить ошибку приведения типав этом случае поместите его в блок try catch и просмотрите подробности logcat, чтобы обнаружить ошибку

, приведенную здесь от строки к длинной или

myIntent1.putExtra(OverLimitDbAdapter.KEY_ROWID,cursor.getString(cursor.getColumnIndexOrThrow(OverLimitDbAdapter.KEY_ROWID)));

, либо получить здесь строку, а затем набрать приведениеот строки к длинной

String s = extras.getString(OverLimitDbAdapter.KEY_ROWID);
mRowId = extras != null ? Long.parseLong(s): null;
...