【问题标题】:Android SQLite - small I/O difficultyAndroid SQLite - 小 I/O 难度
【发布时间】:2012-02-07 15:21:21
【问题描述】:

我创建了一个基本程序来帮助学习 SQLite 和 Android。该应用程序共有 2 个活动:

活动 1:用户输入名字和姓氏,然后按下提交按钮。提交时,此数据将被添加到数据库中,并调用活动 #2。

活动 2:此活动只是从数据库中获取最近的输入并将其显示在屏幕上。

问题是,运行代码时出现 NullPointer 异常。我已经为这两个活动添加了相关代码,以及我的数据库代码,希望有人能告诉我我哪里出错了。感谢您提供的任何帮助。

活动一:

public class DBExampleActivity extends Activity implements OnClickListener{


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Declare the database object and open.
    MyDBManager db = new MyDBManager(this);
    db.open();

    // Take names from EditTexts and store in string.
    first_name  = fname.getText().toString();
    last_name   = lname.getText().toString();   
}

@Override
public void onClick(View view) {
    // In the onclick method, add values to database, call next activity
    db.insertData(first_name, last_name);
    Intent intent = new Intent(this, Display.class);
    startActivity(intent);
}}

活动二:

public class Display extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Cursor myCursor = db.getDetails();

    // Get relevant data from columns in cursor.
    username =  c.getString(c.getColumnIndex("first_name")); 
    password =  c.getString(c.getColumnIndex("last_name")); 

    // set textview values.
    fname.setText(first_name);
    lname.setText(last_name);    
}}

数据库代码:

public class MyDBManager {
public static final String KEY_ROWID = "id";
public static final String KEY_USERNAME = "firstname";
public static final String KEY_PASSWORD = "lastname";

private static final String DATABASE_NAME = "User_Information";
private static final String DATABASE_TABLE = "User_name";
private static final int DATABASE_VERSION = 1;

private static final String DATABASE_CREATE = 
                    "create table " + DATABASE_TABLE + 
                    " (_id integer primary key autoincrement, " + 
                    "username text not null, " + 
                    "password text not null); "  ;

private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;


public MyDBManager(Context context){
    this.context = context;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper{

    DatabaseHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creates the database
    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        // on triggered if the database version has increased. 
        // used if you want to change structure of column: eg add new column.
    }
} // end helper class



// Methods used to access and change data in DB:
public MyDBManager open() throws SQLException{
    db = DBHelper.getWritableDatabase();
    return this;
}   


public void close(){
    DBHelper.close();
}

public long insertData(String username, String password){
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_USERNAME, username);
    initialValues.put(KEY_PASSWORD, password);

    return db.insert(DATABASE_TABLE, null, initialValues);
}


public Cursor getDetails(long rowId){
    Cursor c = db.query(true, DATABASE_TABLE, new String[]{
                    KEY_ROWID,
                    KEY_USERNAME,
                    KEY_PASSWORD},
                    KEY_ROWID + "=" + rowId,
                    null,
                    null,
                    null,
                    null,
                    null);

    if(c != null){
        c.moveToFirst();
    }
    return c;
}}// End myDBManager Class.

编辑:添加 LOGCAT

02-07 16:36:59.376:E/AndroidRuntime(7138):致命异常:主要 02-07 16:36:59.376: E/AndroidRuntime(7138): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.android.dbex/com.android.dbex.Display}: java.lang.NullPointerException 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.app.ActivityThread.access$2300(ActivityThread.java:135) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.os.Handler.dispatchMessage(Handler.java:99) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.os.Looper.loop(Looper.java:144) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.app.ActivityThread.main(ActivityThread.java:4937) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 java.lang.reflect.Method.invokeNative(Native Method) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 java.lang.reflect.Method.invoke(Method.java:521) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-07 16:36:59.376: E/AndroidRuntime(7138): at dalvik.system.NativeStart.main(Native Method) 02-07 16:36:59.376:E/AndroidRuntime(7138):由:java.lang.NullPointerException 引起 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 com.android.dbex.Display.onCreate(Display.java:26) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 02-07 16:36:59.376: E/AndroidRuntime(7138): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 02-07 16:36:59.376: E/AndroidRuntime(7138): ... 11 更多

【问题讨论】:

  • 究竟是什么时候收到 NullPointer 异常,什么时候运行应用程序,或者什么时候尝试进入 Activity 2?
  • 在调用下一个活动时是。
  • 请发布您的 Logcat 输出以及它所引用的行,以便我们实际查看您在哪里得到错误而不是猜测。
  • LOGCAT 添加到原帖

标签: android database sqlite input


【解决方案1】:

您还没有在第二个活动中实例化您的视图:

TextView fname = (TextView) findViewById(R.id.mytextview1);
TextView lname = (TextView) findViewById(R.id.mytextview2);
 // set textview values.
    fname.setText(first_name);
    lname.setText(last_name); 

【讨论】:

  • 你好杜子,谢谢你的回复。据我所知,当数据库打开时,它会一直保持该状态直到关闭。但是我已经尝试过您的建议无济于事..
  • 哦,好的。那么日志会很有用;)
  • 嘿嘟子,我已经声明了TextViews,但我认为包含在问题代码中并不相关。该错误似乎与数据库有关。不过很好发现。
  • 另外,在您的 getDetails-Method 中,您期望一个长参数,但在您的第二个活动中没有传递任何参数
  • 啊,我创建了两个 getDetails(),一个除了 arg,一个没有。我似乎已经在实现之间发布了。但是,在提供 arg 时它不起作用。
猜你喜欢
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2014-10-06
相关资源
最近更新 更多