什么是SQLite
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。
以下是一些关于SQLite学习的有用的网站:
1、SQLite Home Page - SQLite 官方网站提供了最新的 SQLite 安装版本,最新的 SQLite 资讯以及完整的 SQLite 教程。 2、PHP SQLite3 - 网站提供了 SQLite 3 数据库的 PHP 支持的完整细节。 3、DBD-SQLite-0.31 - SQLite Perl driver 驱动程序与 Perl DBI 模块一起使用。 4、DBI-1.625 - Perl DBI 模块为包括 SQLite 在内的任何数据库提供了通用接口。 5、SQLite Python - sqlite3 python 模块由 Gerhard Haring 编写的。它提供了与 DB-API 2.0 规范兼容的 SQL 接口。
项目简述
本次的APP主要要实现两个功能: 1、实现数据库的操作(创建数据库、存入数据——注册、查询并使用数据——登录)。 2、基本的页面跳转以及跳转时数据的携带。
布局文件
activity_main.xml
<GridLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:rowCount="5"
android:columnCount="2">
<TimePicker
android:layout_columnSpan="2"/>
<TextView
android:text="用户名:"
android:layout_row="1"
android:layout_column="0"
android:layout_marginLeft="65dp"
/>
<EditText
android:id="@+id/username"
android:layout_row="1"
android:layout_column="1"
android:layout_marginLeft="-200dp"
android:ems="7"
/>
<TextView
android:text="密码:"
android:layout_row="2"
android:layout_column="0"
android:layout_marginLeft="80dp"
/>
<EditText
android:id="@+id/password"
android:layout_row="2"
android:layout_column="1"
android:inputType="textPassword"
android:layout_marginLeft="-200dp"
android:ems="7"
/>
<LinearLayout
android:weightSum="1.5"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:layout_marginLeft="50dp"
>
<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
android:layout_weight="0.5"
/>
<Button
android:id="@+id/resign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册"
android:layout_weight="0.5" />
<Button
android:id="@+id/btn_new"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重置"
android:layout_weight="0.5"
/>
</LinearLayout>
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:layout_columnSpan="2"/>
</GridLayout>
效果如下:
activity_success.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="网上购书系统"
android:textSize="25dp"
android:textColor="@android:color/holo_blue_light"
/>
<TextView
android:id="@+id/tv_welcome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="xxx 您好"
android:textSize="25dp"
android:textColor="@android:color/holo_red_light"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎光临"
android:textSize="20dp"
android:textColor="@android:color/holo_red_light"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:src="@drawable/hello"/>
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录时间:xxxx-xx-xx"
android:layout_marginTop="10dp"
/>
<Button
android:id="@+id/btn_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="返回"
android:textSize="20dp"/>
</LinearLayout>
效果如下:
activity_fault.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="网上购书系统"
android:textSize="25dp"
android:textColor="@android:color/holo_blue_light"
/>
<TextView
android:id="@+id/tv_welcome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码错误!"
android:textSize="25dp"
android:textColor="@android:color/holo_red_light"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:src="@drawable/hello"/>
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请返回重新登录"
android:layout_marginTop="10dp"
/>
<Button
android:id="@+id/btn_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="返回"
android:textSize="20dp"/>
</LinearLayout>
效果如下:
数据库的创建
要想实现安卓app连接数据库,首先我们要创建一个我们所需要的数据库,值得一提的是,因为是移动设备上的app,所以这个数据库的应用和web的数据库还是有一些区别的,最显著的一点就是我们要用代码来实现数据库的创建,并且这个数据库是直接保存在我们的移动设备上的。
DateBaseHelper.java
这里面我们撰写了DateBaseHelper这个类来实现SQLiteOpenHelper这个方法。
public class DateBaseHelper extends SQLiteOpenHelper {
private static final String TAG="DatabaseHelper";
public DateBaseHelper(@Nullable Context context) {
super(context, Constants.DATEBASE_NAME, null, Constants.VERSION_CODE);
}
public void onCreate(SQLiteDatabase db) {
Log.d(TAG,"创建数据库...");
String sql ="create table "+Constants.TABLE_NAME+"(name varchar(20),password varchar(20))";
db.execSQL(sql);
}
public void insert(SQLiteDatabase sqLiteDatabase, String name,String password){
ContentValues values=new ContentValues();
values.put("name",name);
values.put("password",password);
sqLiteDatabase.insert(Constants.TABLE_NAME,null,values);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG,"升级数据库...");
}
}
Constants.java
public class Constants {
public static String DATEBASE_NAME="10_14homework.db";
public static int VERSION_CODE= 1;
public static final String TABLE_NAME="customers";
}
APP的编写
DateUtil.java
因为我们的app在登陆后有一个实时返回登录时间的功能,如下图: 为了让时间能按照我们预想的格式输出,所以我撰写了一个DateUtil类来存放时间的格式,其实这里面就只用到了一个类:SimpleDateFormat(格式化地输出系统时间)
public class DateUtil {
public static String getNowDateTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
public static String getNowTime() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
return sdf.format(new Date());
}
public static String getNowTimeDetail() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
return sdf.format(new Date());
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
SQLiteDatabase sqLiteDatabase;
DateBaseHelper helper;
private EditText username;
private EditText password;
private String name_str;
private String paswd_str;
private Button resign;
private Button login;
private Button btn_new;
private String mstr="";
private final static String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper=new DateBaseHelper(this);
username=(EditText) findViewById(R.id.username);
password=(EditText) findViewById(R.id.password);
resign=(Button) findViewById(R.id.resign);
login=(Button) findViewById(R.id.login);
btn_new=(Button)findViewById(R.id.btn_new);
sqLiteDatabase = helper.getWritableDatabase();
resign.setOnClickListener(this);
login.setOnClickListener(this);
btn_new.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.resign:
new AlertDialog.Builder(MainActivity.this).setTitle("系统提示")
.setMessage("是否确定提交?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
name_str = username.getText().toString();
paswd_str = password.getText().toString();
Cursor cursor = sqLiteDatabase.query(Constants.TABLE_NAME, new String[]{"name"}, "name=?", new String[]{name_str}, null, null, null);
if (cursor.getCount() != 0) {
Toast.makeText(MainActivity.this, "该用户已注册!", Toast.LENGTH_SHORT).show();
} else {
helper.insert(sqLiteDatabase, name_str, paswd_str);
Toast.makeText(MainActivity.this, "注册成功,请登录!", Toast.LENGTH_SHORT).show();
}
}
}).setNegativeButton("返回", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
}
}).show();
break;
case R.id.login:
String user_str = username.getText().toString();
String psw_str = password.getText().toString();
if (user_str.equals("")) {
Toast.makeText(this, "账号或密码不能为空", Toast.LENGTH_SHORT).show();
}else {
Cursor cursor = sqLiteDatabase.query(Constants.TABLE_NAME, new String[]{"password"}, "name=?", new String[]{user_str}, null, null, null);
if(cursor.moveToNext()){
String psw_query=cursor.getString(cursor.getColumnIndex("password"));
if(psw_str.equals(psw_query)){
Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
Intent intent=new Intent (MainActivity.this,successActivity.class);
intent.putExtra("username",mstr);
startActivity(intent);
break;
}
else{
Intent intent2=new Intent(MainActivity.this,FaultActivity.class);
startActivity(intent2);
}
}
else{
Toast.makeText(this, "账号不存在,请先注册!", Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.btn_new:
username.setText("");
password.setText("");
break;
default:
break;
}
}
}
登录成功和失败后的页面编写
successfulActivity.java
public class successActivity extends AppCompatActivity implements View.OnClickListener {
private String mStr="";
private String mTime;
private final static String TAG="successActivity";
private TextView tv_welcome;
private TextView tv_time;
private Button btn_back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_success);
btn_back=(Button)findViewById(R.id.btn_back);
logintime();
welcome();
btn_back.setOnClickListener(this);
}
private void logintime() {
tv_time=(TextView)findViewById(R.id.tv_time);
mTime = String.format("登录时间 %s", DateUtil.getNowDateTime());
tv_time.setText(mTime);
}
private void welcome(){
Intent intent=getIntent();
String username = intent.getStringExtra("username");
tv_welcome=(TextView)findViewById(R.id.tv_welcome);
mStr=String.format("%s 您好", username);
tv_welcome.setText(mStr);
}
@Override
public void onClick(View v) {
Intent intent2=new Intent(successActivity.this,MainActivity.class);
startActivity(intent2);
}
}
FaultActivity.java
public class FaultActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fault);
btn_back=(Button)findViewById(R.id.btn_back);
btn_back.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent=new Intent(FaultActivity.this,MainActivity.class);
startActivity(intent);
}
}
|