0

I am trying to make a signUp page in which I am asking the user to enter the details and then I am storing them in database and then printing them in another activity on click of "Register Me" button by fetching through database only.

My MainActivity class is:

package com.example.hsports.signuppage;

import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    String name;
    String emailId;
    String password;
    String cnfpassword;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv=(TextView)findViewById(R.id.Title);
        tv.setSelected(true);
    }

    public void storeInfo(View v) {
        name=findViewById(R.id.name).toString();
        emailId=findViewById(R.id.emailId).toString();
        password=findViewById(R.id.password).toString();
        cnfpassword=findViewById(R.id.cnfpassword).toString();


        SQLiteDatabase mydb=openOrCreateDatabase("usersInfo",MODE_PRIVATE,null);
        mydb.execSQL("create table IF NOT EXISTS userInfo ( Name varchar , EmaiId varchar , Password varchar , CnfPassword varchar );");
        mydb.execSQL("insert into userInfo (Name, EmaiId , Password , CnfPassword ) Values( name , emailId , password , cnfpassword);");

        Intent i=new Intent(this,SecondActivity.class);
        startActivity(i);    
    }    
}

My activity_main.xml is:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.hsports.signuppage.MainActivity"
    android:orientation="vertical"
    android:background="@color/WHITE">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Shaadi Mubarak"
        android:textSize="30dp"
        android:textColor="@color/RED"
        android:layout_gravity="center"
        android:id="@+id/TitleText" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="It is a company which aims at bringing people together and it's just a way to make this thing easier."
        android:textSize="15dp"
        android:textColor="@color/BLACK"
        android:textAlignment="center"
        android:paddingBottom="100dp"
        android:id="@+id/Title"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:lines="1"
        android:singleLine="true" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center_horizontal">

        <EditText
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:id="@+id/name"
             android:layout_gravity="center_horizontal"
             android:hint="Enter your Name"
             android:gravity="center_horizontal"
             android:imeOptions="actionGo"
             android:textColor="@color/BLACK" />

        <EditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:inputType="textEmailAddress"
             android:id="@+id/emailId"
             android:hint="Enter your Email Id"
             android:gravity="center_horizontal" />

        <EditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:inputType="textPassword"
             android:ems="10"
             android:id="@+id/password"
             android:hint="Enter Password"
             android:gravity="center_horizontal" />

         <EditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:inputType="textPassword"
             android:ems="10"
             android:id="@+id/cnfpassword"
             android:hint="Confirm your password"
             android:gravity="center_horizontal" />

         <Button
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:text="RegisterMe"
             android:textStyle="bold"
             android:textSize="20dp"
             android:padding="20dp"
             android:onClick="storeInfo" />

    </LinearLayout>

</LinearLayout>

the error which I am getting from the console is :

FATAL EXCEPTION: main
Process: com.example.hsports.signuppage, PID: 7232
  java.lang.IllegalStateException: Could not execute method for android:onClick
      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
      at android.view.View.performClick(View.java:5198)
      at android.view.View$PerformClick.run(View.java:21147)
      at android.os.Handler.handleCallback(Handler.java:739)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:148)
      at android.app.ActivityThread.main(ActivityThread.java:5417)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
   Caused by: java.lang.reflect.InvocationTargetException
      at java.lang.reflect.Method.invoke(Native Method)
      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
      at android.view.View.performClick(View.java:5198) 
      at android.view.View$PerformClick.run(View.java:21147) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
   Caused by: android.database.sqlite.SQLiteException: no such column: name (code 1): , while compiling: insert into userInfo (Name, EmaiId , Password , CnfPassword ) Values( name , emailId , password , cnfpassword);
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
      at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
      at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
      at com.example.hsports.signuppage.MainActivity.storeInfo(MainActivity.java:39)
      at java.lang.reflect.Method.invoke(Native Method) 
      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)                                                                                      at android.view.View.performClick(View.java:5198)                                                                                      at android.view.View$PerformClick.run(View.java:21147)                                                                                      at android.os.Handler.handleCallback(Handler.java:739)                                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)                                                                                      at android.os.Looper.loop(Looper.java:148)                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5417)                                                                                      at java.lang.reflect.Method.invoke(Native Method) 
sandrstar
  • 12,503
  • 8
  • 58
  • 65
shikher.mishra
  • 155
  • 8
  • 24
  • The clue is in the error message `no such column: name`. You're trying to insert into a column that doesn't exist. Care to provide your schema AKA `CREATE table` statement. – Passer by Sep 02 '16 at 16:32
  • I have given the Create Table schema correctly. whats wrong in that? – shikher.mishra Sep 02 '16 at 18:49
  • Never mind, I was on mobile and must've missed it. I'm on my desktop now. The issue is that you didn't escape any of your values, and that's why it was trying to read them in as columns. I'll post the answer in a couple of minutes. – Passer by Sep 02 '16 at 22:50

3 Answers3

0

Try this code instead

public void insertUserInfo () {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(Name, "name");
        values.put(Email, "email");

        db.insert(LEAD_SOURCE_TABLE, null, values);
        db.close();
    }
Hari_krish4
  • 149
  • 7
0

The query failed because you didn't escape any of the values, so it assumed that they were columns in the database.

The INSERT query should be something along the lines of:

mydb.execSQL("INSERT INTO userInfo (Name, EmaiId , Password , CnfPassword ) VALUES ( \"name\" , \"emailId\" , \"password\" , \"cnfpassword\");")

OR

mydb.execSQL("INSERT INTO userInfo (Name, EmaiId , Password , CnfPassword ) VALUES ( 'name' , 'emailId' , 'password' , 'cnfpassword');")

To avoid all the escaping, you may also use the ContentValues approach.

Passer by
  • 562
  • 9
  • 14
0

You are trying to insert these variables?

name=findViewById(R.id.name).toString();
emailId=findViewById(R.id.emailId).toString();
password=findViewById(R.id.password).toString();
cnfpassword=findViewById(R.id.cnfpassword).toString();

If those are TextViews, then you actually want to getText().toString() instead

Then you need to put those values into the query rather than insert raw string values.

Definitely use ContentValues as well instead of raw SQL to prevent SQL injection. Also, I think column names are case sensitive.

SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();
values.put("Name", name); // use the name variable, not the string "name" as the value 
// etc. 

db.insert("userInfo", null, values);
db.close();

Additional note: please do NOT store passwords in plaintext. Why do you even store the confirmation password?

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245