RecyclerView SQLite – INSERT SELECT UPDATE DELETE

RecyclerView SQLite – INSERT SELECT UPDATE DELETE



Rating : 4.7/5 (10)




Android RecyclerView SQLite CRUD tutorial.

Intro

Nowadays most apps need or require to store content or data in some form.There is the cloud but it isn’t a replacement for local storage.Neither will it be in the near future.Storing data locally is important because its easily retrievable,doesn’t require internet connection and is fast. Good old SQLite is still the way to go.Together with Realm database,they are two ways that are now common in data storage.The package we shall be using is android.database.sqlite

It Was added in API 1 and contains classes which your app can use when talking to and managing your database. Android does ship with SQLite database. As of now SQLite 3.4.0. One of those classes is Android.database.sqlite.SQliteDatabase This class derives from android.database.SQLite.SQLiteCloseable and obviously,java.lang.Object.

This class has methods that we can use to basically, manage our SQLite database. It has methods for CRUD stuff. Also execute SQL statements.

A database has to be unique for each single application, within that application. We shall cover Android RecyclerView SQLite CRUD Full.Its a full tutorial to cover and you can easily use it as a template for your application.

 

Tools Used

  • IDE : Android Studio
  • OS : Windows 8.1

Code

Build.GradlePlayer.javaMyHolder.javaMyAdapter.javaItemClickListner.javaConstants.javaDBHelper.javaDBAdapter.javaMainActivity.javaActivityMain.xmlContenMain.xmlmodel.xmlInputDialog.xmlDetailActivity.javaActivityDetail.xmlContenDetail.xmlVideo/DemoDownload

Purpose

  1. Our app level build.gradle.
  2. Add support libaries  components to our application.Dependencies.
apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.tutorials.hp.recyclersqlite"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile 'com.android.support:cardview-v7:23.2.1'
  //  compile 'com.android.support:recyclerview-v7:23.2.1'
}

Purpose :

  1. Is our POJO.Plain Old Java Object
  2. Holds values of a single player.
package com.tutorials.hp.recyclersqlite;
/**
 * Created by Oclemmy on 3/17/2016.
 */
public class Player {
    private String name,position;
    private int id;
    public Player(String name, String position, int id) {
        this.name = name;
        this.position = position;
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}

Purpose :

  1. Our ViewHolder class.
  2. To hold views that we wanna display in our Custom RecyclerView.
  3. Implement our OnItemClick interface,hence making our Views clickable
package com.tutorials.hp.recyclersqlite;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
/**
 * Created by Hp on 3/17/2016.
 */
public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    ImageView img;
    TextView nameTxt,posTxt;
    ItemClickListener itemClickListener;
    public MyHolder(View itemView) {
        super(itemView);
        //ASSIGN
        img= (ImageView) itemView.findViewById(R.id.playerImage);
        nameTxt= (TextView) itemView.findViewById(R.id.nameTxt);
        posTxt= (TextView) itemView.findViewById(R.id.posTxt);
        itemView.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        this.itemClickListener.onItemClick(v,getLayoutPosition());
    }
    public void setItemClickListener(ItemClickListener ic)
    {
        this.itemClickListener=ic;
    }
}

 

Purpose :

  1. Our adapter class.
  2. Initialize our ViewHolder class
  3. Bind our views to data.
  4. Pack data to be sent to new activity
  5. Open new activity and pass data to it on RecyclerView itemClick.
package com.tutorials.hp.recyclersqlite;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
/**
 * Created by Oclemmy on 3/17/2016.
 */
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
    Context c;
    ArrayList<Player> players;
    public MyAdapter(Context ctx,ArrayList<Player> players)
    {
        //ASSIGN THEM LOCALLY
        this.c=ctx;
        this.players=players;
    }
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //VIEW OBJ FROM XML
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null);
        //holder
        MyHolder holder=new MyHolder(v);
        return holder;
    }
    //BIND DATA TO VIEWS
    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
           holder.posTxt.setText(players.get(position).getPosition());
           holder.nameTxt.setText(players.get(position).getName());
        //HANDLE ITEMCLICKS
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(View v, int pos) {
                //OPEN DETAIL ACTIVITY
                //PASS DATA
                //CREATE INTENT
                Intent i=new Intent(c,DetailActivity.class);
                //LOAD DATA
                i.putExtra("NAME",players.get(pos).getName());
                i.putExtra("POSITION",players.get(pos).getPosition());
                i.putExtra("ID",players.get(pos).getId());
                //START ACTIVITY
                c.startActivity(i);
            }
        });
    }
    @Override
    public int getItemCount() {
        return players.size();
    }
}

Our ItemClickListner interface.

Purpose :

  1. Define for us the method to be overriden when the interface is overridden.
  2. Helps us cleanly and easily implement our View itemClicks.
package com.tutorials.hp.recyclersqlite;
import android.view.View;
/**
 * Created by Oclemmy on 3/17/2016.
 */
public interface ItemClickListener {
    void onItemClick(View v,int pos);
}

Our Constants class

Purpose :

  1. Helps us clean define static fields that we can easily and cleanly use with regards to our database,e.g columns,database,table names etc.
  2. We change once ,we change everywhere.
package com.tutorials.hp.recyclersqlite;
/**
 * Created by Hp on 3/17/2016.
 */
public class Contants {
    //COLUMNS
    static final String ROW_ID="id";
    static final String NAME = "name";
    static final String POSITION = "position";
    //DB PROPERTIES
    static final String DB_NAME="b_DB";
    static final String TB_NAME="b_TB";
    static final int DB_VERSION='1';
//CREATE TABLE
    static final String CREATE_TB="CREATE TABLE b_TB(id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "name TEXT NOT NULL,position TEXT NOT NULL);";
}

Our DBHelper class

Purpose :

  1. Its a helper class.It helps us.To do what?? To create our tables and update them to new version.
package com.tutorials.hp.recyclersqlite;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
 * Created by Hp on 3/17/2016.
 */
public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(Context context) {
        super(context, Contants.DB_NAME, null, Contants.DB_VERSION);
    }
    //WHEN TB IS CREATED
    @Override
    public void onCreate(SQLiteDatabase db) {
        try
        {
            db.execSQL(Contants.CREATE_TB);
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
    //UPGRADE TB
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       db.execSQL("DROP TABLE IF EXISTS"+Contants.TB_NAME);
        onCreate(db);
    }
}

Our DBAdapter class.

Purpose :

  1. Its an adapter class.Our database adapter.
  2. We will perform various insert,select,update and delete CRUD operations here
  3.  It opens our database connection,inserts,selects,updates data,deletes data and finally close our database.It communicates with DBHelper class and is instantiated by our MainActivity class.
package com.tutorials.hp.recyclersqlite;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
/**
 * Created by Hp on 3/17/2016.
 */
public class DBAdapter {
    Context c;
    SQLiteDatabase db;
    DBHelper helper;
    public DBAdapter(Context ctx)
    {
        this.c=ctx;
        helper=new DBHelper(c);
    }
    //OPEN DB
    public DBAdapter openDB()
    {
        try
        {
            db=helper.getWritableDatabase();
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        return this;
    }
    //CLOSE
    public void close()
    {
        try
        {
            helper.close();
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
    //INSERT DATA TO DB
    public long add(String name,String pos)
    {
        try
        {
            ContentValues cv=new ContentValues();
            cv.put(Contants.NAME,name);
            cv.put(Contants.POSITION, pos);
            return db.insert(Contants.TB_NAME,Contants.ROW_ID,cv);
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        return 0;
    }
    //RETRIEVE ALL PLAYERS
    public Cursor getAllPlayers()
    {
        String[] columns={Contants.ROW_ID,Contants.NAME,Contants.POSITION};
        return db.query(Contants.TB_NAME,columns,null,null,null,null,null);
    }
    //UPDATE
    public long UPDATE(int id,String name,String pos)
    {
        try
        {
            ContentValues cv=new ContentValues();
            cv.put(Contants.NAME,name);
            cv.put(Contants.POSITION, pos);
            return db.update(Contants.TB_NAME,cv,Contants.ROW_ID+" =?",new String[]{String.valueOf(id)});
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        return 0;
    }
    //DELETE
    public long Delete(int id)
    {
        try
        {
            return db.delete(Contants.TB_NAME,Contants.ROW_ID+" =?",new String[]{String.valueOf(id)});
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        return 0;
    }
}

OUR MASTER/MAIN ACTIVITY.

Purpose:

  1. Its our launcher activity.
  2. Handle GUI saving of data,updateing,retrieveing/selecting and deleting of data.
  3. It talks to our DBAdapter class to perform the details.
package com.tutorials.hp.recyclersqlite;
import android.app.Dialog;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
    EditText nameTxt,posTxt;
    RecyclerView rv;
    MyAdapter adapter;
    ArrayList<Player> players=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDialog();
            }
        });
        //recycler
        rv= (RecyclerView) findViewById(R.id.myRecycler);
        //SET ITS PROPS
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.setItemAnimator(new DefaultItemAnimator());
        //ADAPTER
        adapter=new MyAdapter(this,players);
        retrieve();
    }
    private void showDialog()
    {
        Dialog d=new Dialog(this);
        //NO TITLE
        d.requestWindowFeature(Window.FEATURE_NO_TITLE);
        //layout of dialog
        d.setContentView(R.layout.custom_layout);
        nameTxt= (EditText) d.findViewById(R.id.nameEditTxt);
        posTxt= (EditText) d.findViewById(R.id.posEditTxt);
        Button savebtn= (Button) d.findViewById(R.id.saveBtn);
        Button retrieveBtn= (Button) d.findViewById(R.id.retrieveBtn);
        //ONCLICK LISTENERS
        savebtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               save(nameTxt.getText().toString(),posTxt.getText().toString());
            }
        });
        retrieveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                retrieve();
            }
        });
        //SHOW DIALOG
        d.show();
    }
    //SAVE
    private void save(String name,String pos)
    {
        DBAdapter db=new DBAdapter(this);
        //OPEN
        db.openDB();
        //INSERT
        long result=db.add(name,pos);
        if(result>0)
        {
            nameTxt.setText("");
            posTxt.setText("");
        }else
        {
            Snackbar.make(nameTxt,"Unable To Insert",Snackbar.LENGTH_SHORT).show();
        }
        //CLOSE
        db.close();
        //refresh
        retrieve();
    }
    //RETRIEVE
    private void retrieve()
    {
        DBAdapter db=new DBAdapter(this);
        //OPEN
        db.openDB();
        players.clear();
        //SELECT
        Cursor c=db.getAllPlayers();
        //LOOP THRU THE DATA ADDING TO ARRAYLIST
        while (c.moveToNext())
        {
            int id=c.getInt(0);
            String name=c.getString(1);
            String pos=c.getString(2);
            //CREATE PLAYER
            Player p=new Player(name,pos,id);
            //ADD TO PLAYERS
            players.add(p);
        }
        //SET ADAPTER TO RV
        if(!(players.size()<1))
        {
            rv.setAdapter(adapter);
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        retrieve();
    }
}

 

Our Main Activity Layout.

Purpose:

  1. Acts as our template layout.
  2. Holds the ContentMain layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.tutorials.hp.recyclersqlite.MainActivity">
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.AppBarLayout>
    <include layout="@layout/content_main" />
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
  1. Hold our RecyclerView.Which of course holds our data.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.tutorials.hp.recyclersqlite.MainActivity"
    tools:showIn="@layout/activity_main">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/myRecycler"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        class="android.support.v7.widget.RecyclerView" />
</RelativeLayout>

Purpose :

  1. Yes its the model.It represents how each single view in our RecyclerView shall be represented.
  2. Holds our child view e.g EditTexts,TextView and buttons.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_margin="5dp"
    card_view:cardCornerRadius="10dp"
    card_view:cardElevation="5dp"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/playerImage"
            android:padding="10dp"
            android:src="@drawable/g" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Name"
            android:id="@+id/nameTxt"
            android:padding="10dp"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/playerImage" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Position"
            android:id="@+id/posTxt"
            android:padding="10dp"
            android:layout_alignBottom="@+id/playerImage"
            android:layout_alignParentRight="true" />
    </RelativeLayout>
</android.support.v7.widget.CardView>
  1. Is our Custom Input Dialog made from a CardView
  2. Basically what contains buttons and EditTexts that we shall use for inputting data to database.Also contains button for data retrieval.
<?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal" android:layout_width="500dp"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_margin="1dp"
        card_view:cardCornerRadius="10dp"
        card_view:cardElevation="5dp"
        android:layout_height="match_parent">
    <LinearLayout
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="match_parent">
            <ImageView
                android:id="@+id/image"
                android:layout_width="190dp"
                android:layout_height="275dp"
                android:paddingLeft="15dp"
                android:scaleType="fitCenter"
                android:src="@drawable/g"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_below="@+id/posEditTxt" />
            <TextView
                android:id="@+id/profile"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:textColor="@color/colorAccent"
                android:text="PLAYER PROFILE"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:layout_below="@+id/image"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true" />
            <EditText
                android:id="@+id/nameEditTxt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:paddingLeft="15dp"
                android:hint="Name"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:layout_below="@+id/profile" />
            <EditText
                android:id="@+id/posEditTxt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_below="@+id/nameTxt"
                android:paddingLeft="15dp"
                android:layout_marginTop="24dp"
                android:hint="Position : "
                android:textAppearance="?android:attr/textAppearanceLarge" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="52dp"
                android:gravity="center_vertical|end"
                android:orientation="horizontal"
                android:id="@+id/linear1"
                android:padding="8dp"
                android:layout_alignParentBottom="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true">
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:gravity="center_vertical|center_horizontal"
                    android:text="Save"
                    android:id="@+id/saveBtn" />
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:gravity="center_vertical|center_horizontal"
                    android:text="Retrieve"
                    android:id="@+id/retrieveBtn" />
            </LinearLayout>
</LinearLayout>
    </android.support.v7.widget.CardView>

OUR DETAIL ACTIVITY

Purpose :

  1. Receives the details sent from the Master Activity using Intent object.
  2. Displays those Details in Views.
  3. Talks to DBAdapter class to help in performing Update and Delete from database.
package com.tutorials.hp.recyclersqlite;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
public class DetailActivity extends AppCompatActivity {
    ImageView img;
    EditText nameTxt,posTxt;
    Button updateBtn,deleteBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        //RECEIVE DATA FROM MAIN ACTIVITY
        Intent i=getIntent();
        final String name=i.getExtras().getString("NAME");
        final String pos=i.getExtras().getString("POSITION");
        final int id=i.getExtras().getInt("ID");
        updateBtn= (Button) findViewById(R.id.updateBtn);
        deleteBtn= (Button) findViewById(R.id.deleteBtn);
        nameTxt= (EditText) findViewById(R.id.nameEditTxt);
        posTxt= (EditText) findViewById(R.id.posEditTxt);
        //ASSIGN DATA TO THOSE VIEWS
        nameTxt.setText(name);
        posTxt.setText(pos);
        //update
        updateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                update(id,nameTxt.getText().toString(),posTxt.getText().toString());
            }
        });
        //DELETE
        //update
        deleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              delete(id);
            }
        });
    }
    private void update(int id,String newName,String newPos)
    {
        DBAdapter db=new DBAdapter(this);
        db.openDB();
        long result=db.UPDATE(id,newName,newPos);
        if(result>0)
        {
            nameTxt.setText(newName);
            nameTxt.setText(newPos);
            Snackbar.make(nameTxt,"Updated Sucesfully",Snackbar.LENGTH_SHORT).show();
        }else
        {
            Snackbar.make(nameTxt,"Unable to Update",Snackbar.LENGTH_SHORT).show();
        }
        db.close();
    }
    //DELETE
    private void delete(int id)
    {
        DBAdapter db=new DBAdapter(this);
        db.openDB();
        long result=db.Delete(id);
        if(result>0)
        {
            this.finish();
        }else
        {
            Snackbar.make(nameTxt,"Unable to Update",Snackbar.LENGTH_SHORT).show();
        }
        db.close();
    }
}

 

Purpose :

  1. Acts as template for our detailcontent layout.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.tutorials.hp.recyclersqlite.DetailActivity">
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.AppBarLayout>
    <include layout="@layout/content_detail" />
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>

Purpose :

  1. Holds for us the views like Edittexts and TextViews form which the data shall be displayed or edited.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.tutorials.hp.recyclersqlite.DetailActivity"
    tools:showIn="@layout/activity_detail">
    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal" android:layout_width="match_parent"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_margin="5dp"
        card_view:cardCornerRadius="10dp"
        card_view:cardElevation="5dp"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="match_parent">
            <ImageView
                android:id="@+id/image"
                android:layout_width="190dp"
                android:layout_height="275dp"
                android:paddingLeft="15dp"
                android:scaleType="fitCenter"
                android:src="@drawable/yoda"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_below="@+id/playerImage" />
            <TextView
                android:id="@+id/profile"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:textColor="@color/colorAccent"
                android:text="PLAYER PROFILE"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:layout_below="@+id/image"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true" />
            <EditText
                android:id="@+id/nameEditTxt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:paddingLeft="15dp"
                android:hint="Name"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:layout_below="@+id/profile" />
            <EditText
                android:id="@+id/posEditTxt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_below="@+id/nameTxt"
                android:paddingLeft="15dp"
                android:layout_marginTop="24dp"
                android:hint="Position : "
                android:textAppearance="?android:attr/textAppearanceLarge" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="52dp"
                android:gravity="center_vertical|end"
                android:orientation="horizontal"
                android:id="@+id/linear1"
                android:padding="8dp"
                android:layout_alignParentBottom="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true">
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:height="48dp"
                    android:clickable="true"
                    android:padding="5dp"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:gravity="center_vertical|center_horizontal"
                    android:text="Update"
                    android:textColor="@color/colorPrimary"
                    android:id="@+id/updateBtn" />
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:height="48dp"
                    android:clickable="true"
                    android:padding="5dp"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:gravity="center_vertical|center_horizontal"
                    android:text="Delete"
                    android:textColor="@color/colorPrimary"
                    android:id="@+id/deleteBtn" />
            </LinearLayout>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:height="150dp"
                android:clickable="true"
                android:padding="5dp"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:gravity="center_vertical|center_horizontal"
                android:text="The player joined in the year 2006.
            He has won every trophy imaginable since joining.
            He works hard for the team and is a good example.
            "
                android:textColor="@color/colorPrimaryDark"
                android:id="@+id/info"
                android:layout_below="@+id/posEditTxt"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_toRightOf="@+id/image"
                android:layout_toEndOf="@+id/image"
                android:layout_alignBottom="@+id/image" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</RelativeLayout>

Video tutorial/Demo

  • We also have a video tutorial for this example explained in a step by step manner.
  • Moreover you can view the project demo there.
  • The full source code reference is of course in the link above.

RecyclerView SQLite Database 03 : Master Detail - INSERT,SELECT UPDATE DELETE Full [With SourceCode]

- You can Download the full Project below. Source code is well commented.

Download

How to Run

  • Download the project above.
  • You'll get a zipped file,extract it.
  • Open the Android Studio.
  • Now close, already open project
  • From the Menu bar click on File >New> Import Project
  • Now Choose a Destination Folder, from where you want to import project.
  • Choose an Android Project.
  • Now Click on “OK“.
  • Done, your done importing the project,now edit it.

More

YouTube

  • Visit our channel for more examples like these.

Facebook

Oclemy,Cheers.



Rating :

Leave a Reply

Your email address will not be published. Required fields are marked *

four × 3 =

COMMENTS