Android - 获取userName whit用户并传递给另一个活动

时间:2017-05-13 15:16:30

标签: android sqlite

您好我想在Start.java中获取userName并在Welcom.java中显示它sqlite数据库,但是当我点击按钮时我在genymotion中收到错误:不幸的是,测试已停止。有谁可以帮助我?

开始活动:

package com.iran.test;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Start extends Activity {

    EditText name;
    Button save;

    DataBase database;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.start);

        name = (EditText) findViewById(R.id.name_edittext);
        save = (Button) findViewById(R.id.add_button);
        save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String getName = "";
                database = new DataBase(getBaseContext());
                database.open();
                Cursor C = database.insertData(getName);
                getName = C.getString(0);       

                Intent intent = new Intent(Start.this, Welcome.class);
                Bundle extras = new Bundle();
                extras.putString("data", getName); 
                intent.putExtras(extras);
                startActivity(intent);

                Toast.makeText(getApplicationContext(), "Data Saved.", Toast.LENGTH_LONG).show();
                database.close();

                Thread thread = new Thread() {
                    public void run() {
                        try {
                            sleep(3000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } 
                };
                thread.start();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.start, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

数据库:

package com.iran.test;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBase {

    public static final String NAME = "name";
    public static final String TABLE_NAME = "mytable";
    public static final String DATA_BASE_NAME = "data_base_name";
    public static final int DATABASE_VERSION = 1;
    public static final String TABLE_CREATE = "create table mytable (name text not null, surname text not null);";

    DataBaseHelper dbhelper;
    SQLiteDatabase db;
    Context context;

    public DataBase(Context context) {
        this.context = context;
        dbhelper = new DataBaseHelper(context);
    }

    private static class DataBaseHelper extends SQLiteOpenHelper {  

        public DataBaseHelper(Context context) {
            super(context, DATA_BASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            try {
                db.execSQL(TABLE_CREATE);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXIST mytable");
            onCreate(db);
        }
    }

    public DataBase open() {
        db = dbhelper.getWritableDatabase();
        return this;
    }

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

    public long insertData(String name, String surname) {
        ContentValues content = new ContentValues();
        content.put(NAME, name);
        return db.insertOrThrow(TABLE_NAME, null, content);
    }

    public Cursor insertData(String name) {
        return db.query(TABLE_NAME, new String[] {NAME}, null, null, null, null,null);
    }
}

欢迎活动:

package com.iran.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class Welcome extends Activity {

    DataBase database;
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.welcome);

        Intent intent = getIntent();
        String data = intent.getExtras().getString("data");


        tv = (TextView) findViewById(R.id.textView1);
        tv.setText("Hello " + data);
    }
}

2 个答案:

答案 0 :(得分:0)

也许您应该首先阅读名称中的文字,否则您正在寻找一个空白字符串:

String getName = name.getText();

并且更改了insertName方法,因为它没有插入任何内容,并且您没有给出姓氏,我猜姓名和姓氏之间用空格分隔:

public Cursor insertData(String name) {
    String[] data = name.split(" ");
    db.execSQL("INSERT INTO mytable (name, surname) VALUES "+data[0] + " "+data[1]);
    return db.query(TABLE_NAME, new String[] {NAME}, null, null, null, null,null);
}
顺便说一句,如果你返回START_STICKY,你不需要那个线程,活动将会活着,而创建它的前一个活动是活着的

答案 1 :(得分:0)

您可能会收到NullPointerException,下面一行:

getName = C.getString(0);

目前您的insertData()无法insert任何内容。因此,您的表格为empty,导致此exception

更新insertData(),如下所示:

public Cursor insertData(String name) {

    ContentValues values = new ContentValues();
    values.put(NAME, name);

    // Insert
    db.insert(TABLE_NAME, null, values);

    return db.query(TABLE_NAME, new String[] {NAME}, null, null, null, null, null);
}

onClick()方法内部,首先从name获取EditText,然后将name插入表格并将其传递给Welcome活动。

更新onClick()方法,如下所示:

        @Override
        public void onClick(View v) {
            // Name
            String getName = name.getText().toString();

            database = new DataBase(getBaseContext());
            database.open();

            Cursor C = database.insertData(getName);

            if(C != null) {
                C.moveToFirst();
                getName = C.getString(0);       
            }

            Intent intent = new Intent(Start.this, Welcome.class);
            intent.putExtra("data", getName);
            startActivity(intent);

            Toast.makeText(getApplicationContext(), "Data Saved.", Toast.LENGTH_LONG).show();
            database.close();

            Thread thread = new Thread() {
                public void run() {
                    try {
                        sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } 
            };
            thread.start();
        }

希望这会有所帮助〜