简体   繁体   中英

App stops working when clicked on Button coded to save, refresh and search

I need help fixing a problem with my 3 buttons that don't work properly and I'm not sure how to fix it. The "Save" button is to keep my database save, the "Refresh" button is to clear, and the "Search" button is to find an existing database. My TextView shows the existing database after registered. These are my goals to accomplish.

Here are my code files:

XML File: activity_main:

        <?xml version="1.0" encoding="utf-8"?>
        <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            xmlns:tools="http://schemas.android.com/tools"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_verticsl_margin"
            android:paddingBottom="@dimen/activity_verticsl_margin"
            tools:context=".MainActivity">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="30dip"
                android:gravity="center"
                android:text="Registration"/>

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:weightSum="1">

                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/txtid"
                    android:hint="ID"
                    android:inputType="number"
                    android:layout_marginTop="5dip"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/txtfirstname"
                    android:hint="@string/first_name"
                    android:layout_marginTop="5dip"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/txtlastname"
                    android:hint="@string/last_name"
                    android:layout_marginTop="5dip"
                    />            
                <EditText
                    android:id="@+id/txtmail"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dip"
                    android:hint="@string/e_mail" />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/txtuser"
                    android:hint="@string/username"
                    android:layout_marginTop="5dip"/>
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/txtpw"
                    android:hint="@string/password"
                    android:layout_marginTop="5dip"/>

                <LinearLayout
                    android:orientation="horizontal"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
                    <Button
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="save"
                        android:textColor="#fff"
                        android:textSize="15dip"
                        android:id="@+id/btnsave"
                        android:layout_weight="1"
                        android:layout_gravity="center_horizontal"/>

                    <Button
                        android:id="@+id/btnclear"
                        android:layout_width="212dp"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_horizontal"
                        android:layout_weight=".30"
                        android:text="refresh"
                        android:textColor="#fff"
                        android:textSize="15dip"/>

                    <Button
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="search"
                        android:textColor="#fff"
                        android:textSize="15dip"
                        android:id="@+id/btnsearch"
                        android:layout_weight="1"
                        android:layout_gravity="center_horizontal"/>                        
                </LinearLayout>

            </LinearLayout>            

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="New Text"
                android:id="@+id/textView"/>

        </TableLayout>

Java File StudentRegistration.java :

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

        public class StudentRegistration {

            public static final String KEY_ROWID ="_id";
            public static final String KEY_FNAME = "fname";
            public static final String KEY_LNAME = "lname";
            public static final String KEY_EMAIL = "email";
            public static final String KEY_USER ="user";
            public static final String KEY_PASS ="pass";

            private static final String DATABASE_NAME = "StudentDB";
            private static final String DATABASE_TABLE = "StudentTbl";
            private static final int DATABASE_VERSION = 1;

            private DBHelper ourHelper;
            private final Context ourContext;
            private SQLiteDatabase ourDatabase;

            private static class DBHelper extends SQLiteOpenHelper {

                public DBHelper(Context context) {
                    super(context, DATABASE_NAME,
                            null, DATABASE_VERSION);
                }
                @Override
                public void onCreate(SQLiteDatabase db) {
                    db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                            KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                            KEY_FNAME + " TEXT NOT NULL, " +
                            KEY_LNAME + " TEXT NOT NULL, " +
                            KEY_EMAIL + " TEXT NOT NULL, " +
                            KEY_USER + " TEXT NOT NULL, " +
                            KEY_PASS + " TEXT NOT NULL);");
                }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

                    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME);
                    onCreate(db);

                }
            }
            public StudentRegistration(Context c) {
                ourContext = c;
            }
            public StudentRegistration open() {
                ourHelper = new DBHelper(ourContext);
                ourDatabase = ourHelper.getWritableDatabase();
                return this;
            }
            public void close() {
                ourHelper.close();
            }
            public long savedata(String fname, String lname, String email, String user, String pass) {
                ContentValues cv = new ContentValues();
                cv.put(KEY_FNAME, fname);
                cv.put(KEY_LNAME, lname);
                cv.put(KEY_EMAIL, email);
                cv.put(KEY_USER, user);
                cv.put(KEY_PASS, pass);
                return ourDatabase.insert(DATABASE_TABLE, null, cv);            
            }

            public String getData(){
                String[] refresh = new String[] {KEY_ROWID, KEY_FNAME, KEY_LNAME, KEY_EMAIL, KEY_USER, KEY_PASS};
                Cursor c = ourDatabase.query(DATABASE_TABLE, refresh, null, null, null, null, null);
                String result = "";

                int iRow = c.getColumnIndex(KEY_ROWID);
                int iFName = c.getColumnIndex(KEY_FNAME);
                int iLName = c.getColumnIndex(KEY_LNAME);
                int iEmail = c.getColumnIndex(KEY_EMAIL);
                int iUser = c.getColumnIndex(KEY_USER);
                int iPass = c.getColumnIndex(KEY_PASS);

                for(c.moveToFirst(); !c.isAfterLast();c.moveToNext()){
                    result = result + c.getString(iRow)
                            + " " + c.getString(iFName)
                            + " " + c.getString(iLName)
                            + " " + c.getString(iEmail)
                            + " " + c.getString(iUser)
                            + " " + c.getString(iPass)
                            + "\n\n";            
                }

                return result;            
            }

            public String getFName(long l){
                String[] getfname = new String[] {KEY_ROWID, KEY_FNAME, KEY_LNAME,
                        KEY_EMAIL, KEY_USER, KEY_PASS};
                Cursor c = ourDatabase.query(DATABASE_TABLE, getfname, KEY_ROWID + "="
                        + 1, null, null, null, null);

                if(c != null){
                    c.moveToFirst();
                    String fname = c.getString(1);
                    return fname;
                }

                return null;
            }
            public String getLName(long l){

                String[] getlname = new String[] {KEY_ROWID, KEY_FNAME, KEY_LNAME,
                        KEY_EMAIL, KEY_USER, KEY_PASS};
                Cursor c = ourDatabase.query(DATABASE_TABLE, getlname, KEY_ROWID + "="
                        + 1, null, null, null, null);

                if(c != null){
                    c.moveToFirst();
                    String lname = c.getString(2);
                    return lname;
                }
                return null;
            }
            public String getEmail(long l){
                String[] getemail = new String[] {KEY_ROWID, KEY_FNAME, KEY_LNAME,
                        KEY_EMAIL, KEY_USER, KEY_PASS};
                Cursor c = ourDatabase.query(DATABASE_TABLE, getemail, KEY_ROWID + "="
                        + 1, null, null, null, null);

                if(c != null){
                    c.moveToFirst();
                    String email = c.getString(3);
                    return email;
                }
                return null;
            }
            public String getUser(long l){
                String[] getuser = new String[] {KEY_ROWID, KEY_FNAME, KEY_LNAME,
                        KEY_EMAIL, KEY_USER, KEY_PASS};
                Cursor c = ourDatabase.query(DATABASE_TABLE, getuser, KEY_ROWID + "="
                        + 1, null, null, null, null);

                if(c != null){
                    c.moveToFirst();
                    String user = c.getString(4);
                    return user;
                }
                return null;
            }
            public String getPass(long l){
                String[] getpass = new String[] {KEY_ROWID, KEY_FNAME, KEY_LNAME,
                        KEY_EMAIL, KEY_USER, KEY_PASS};
                Cursor c = ourDatabase.query(DATABASE_TABLE, getpass, KEY_ROWID + "="
                        + 1, null, null, null, null);

                if(c != null){
                    c.moveToFirst();
                    String pass = c.getString(5);
                    return pass;
                }
                return null;
            }

        }

and the java file MainActivity:

        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.view.View;
        import android.widget.Button;
        import android.widget.EditText;
        import android.widget.TextView;
        import android.widget.Toast;

        public class MainActivity extends AppCompatActivity {

            EditText FirstName, LastName, Email, UserName, Password, ID;
            Button Save, Clear, Search;
            TextView TxtData;

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

                FirstName = (EditText)findViewById(R.id.txtfirstname);
                LastName = (EditText)findViewById(R.id.txtlastname);
                Email = (EditText)findViewById(R.id.txtmail);
                UserName = (EditText)findViewById(R.id.txtuser);
                Password = (EditText)findViewById(R.id.txtpw);
                TxtData =(TextView)findViewById(R.id.textView);

                Save =(Button)findViewById(R.id.btnsave);
                Clear=(Button)findViewById(R.id.btnclear);
                Search=(Button)findViewById(R.id.btnsearch);

                Search.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View v) {
                        String search = ID.getText().toString();
                        Long l= Long.parseLong(search);

                        StudentRegistration mysearch = new
                                StudentRegistration(MainActivity.this);
                        mysearch.open();
                        String returnedFname = mysearch.getFName(l);
                        String returnedLname = mysearch.getLName(l);
                        String returnedEmail = mysearch.getEmail(l);
                        String returnedUser = mysearch.getUser(l);
                        String returnedPass = mysearch.getPass(l);
                        mysearch.close();

                        FirstName.setText(returnedFname);
                        LastName.setText(returnedLname);
                        Email.setText(returnedEmail);
                        UserName.setText(returnedUser);
                        Password.setText(returnedPass);            
                    }
                });

                Save.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {            

                            String fname = FirstName.getText().toString();
                            String lname = LastName.getText().toString();
                            String email = Email.getText().toString();
                            String user = UserName.getText().toString();
                            String pass = Password.getText().toString();

                            StudentRegistration save = new StudentRegistration(MainActivity.this);
                            save.open();
                           save.savedata(fname, lname, email, user, pass);

                        FirstName.setText("");
                        LastName.setText("");
                        Email.setText("");
                        UserName.setText("");
                        Password.setText("");
                        ID.setText("");
                        }            
                });

                Clear.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View v){
                        StudentRegistration refresh = new StudentRegistration(MainActivity.this);
                        refresh.open();

                        String data = refresh.getData();
                        refresh.close();
                        TxtData.setText(data);

                        FirstName.setText("");
                        LastName.setText("");
                        Email.setText("");
                        UserName.setText("");
                        Password.setText("");
                        ID.setText("");

                    }
                });
            }
        }

My Manifest File:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.classifiedinformation">

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">

                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

        </application>

How can I accomplish my goals?

First of all some hints about what went wrong would have been nice.

You need to initialize ID like you did with the other EditText's.
Add ID = findViewById(R.id.txtid); to your onCreate(Bundle savedInstanceState) method.

The first thing I got when clicking on 'Save' was the following:

   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
    at com.citiesapps.myapplication.MainActivity$2.onClick(MainActivity.java:76)
    at android.view.View.performClick(View.java:5610)
    at android.view.View$PerformClick.run(View.java:22265)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

As the stacktrace states you are trying to invoke a method on a null-object in this case 'ID'.

After analyzing your code, i saw your are executing setText on an editText that is not initialized in your java class.

Probable editText code is :

ID.setText(""); Here ID is not initialized with xml file.

Use ID = findViewById(R.id.txtid); for initializing the ID field

Check all editText initialization. Then use that editText.

Thanks :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM