package org.jerry;
import org.hwq.dbutil.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView info;
private Button runWrongBtn;
private Button runRightBtn;
private Button showInfoBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
holdUIComponents();
showInfo();
}
private void holdUIComponents() {
info = (TextView) findViewById(R.id.info);
runWrongBtn = (Button) findViewById(R.id.runWrongBtn);
runRightBtn = (Button) findViewById(R.id.runRightBtn);
showInfoBtn = (Button) findViewById(R.id.showInfoBtn);
runWrongBtn.setOnClickListener(this);
runRightBtn.setOnClickListener(this);
showInfoBtn.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.runWrongBtn:
runWrong();
break;
case R.id.runRightBtn:
runRight();
break;
case R.id.showInfoBtn:
showInfo();
break;
}
}
private void runWrong() {
//因为不同步,会导致异常:database is locked
RunWrongThread t0 = new RunWrongThread();
RunWrongThread t1 = new RunWrongThread();
t0.start();
t1.start();
try {
t0.join();
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
showInfo();
}
private void runRight() {
//有同步,执行正常
RunRightThread t0 = new RunRightThread();
RunRightThread t1 = new RunRightThread();
t0.start();
t1.start();
try {
t0.join();
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
showInfo();
}
private void showInfo() {
int userNums = DBUtil.getUserNums(getApplicationContext());
info.setText(Integer.toString(userNums));
}
class RunWrongThread extends Thread {
@Override
public void run() {
DBOpenHelper dbHelper = new DBOpenHelper(getApplicationContext());
for (int i = 0; i < 100; i++) {
User user = new User();
user.setName("name" + i);
user.setAge(i);
user.setEmail("email" + i);
dbHelper.insert(user);
}
dbHelper.close();
}
}
class RunRightThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
User user = new User();
user.setName("name" + i);
user.setAge(i);
user.setEmail("email" + i);
DBUtil.insertUser(getApplicationContext(), user);
}
DBUtil.close();
}
}
}
package org.jerry;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper{
private static final String DB_NAME = "db";
private static final int DB_VERSION = 1;
private static final String T_USER = "t_user";
private static final String T_USER_COLUMN_ID = "id";
private static final String T_USER_COLUMN_NAME = "name";
private static final String T_USER_COLUMN_AGE = "age";
private static final String T_USER_COLUMN_EMAIL = "email";
private static final String T_USER_SQL = "create table " + T_USER + " (" + T_USER_COLUMN_ID + " integer primary key autoincrement, " + T_USER_COLUMN_NAME + " text, " + T_USER_COLUMN_AGE + " integer, " + T_USER_COLUMN_EMAIL + " text)";
public DBOpenHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(T_USER_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void insert(User user) {
if (user == null) {
return;
}
final ContentValues values = new ContentValues();
values.put(T_USER_COLUMN_NAME, user.getName());
values.put(T_USER_COLUMN_AGE, user.getAge());
values.put(T_USER_COLUMN_EMAIL, user.getEmail());
final SQLiteDatabase db = getWritableDatabase();
db.insert(T_USER, null, values);
}
public int getUserNums() {
final SQLiteDatabase db = getReadableDatabase();
final Cursor cursor = db.query(T_USER, null, null, null, null, null, null);
if (cursor == null) {
return 0;
}
int count = cursor.getCount();
cursor.close();
return count;
}
}
package org.jerry;
import android.content.Context;
public class DBUtil {
private static DBOpenHelper dbHelper;
private static void ensureDBHelperExist(Context context) {
if (dbHelper == null) {
dbHelper = new DBOpenHelper(context);
}
}
/**
* 插入user
* @param context 务必使用ApplicationContext,直接使用activity/service的context可能导致内存泄露
* @param user
*/
public synchronized static void insertUser(Context context, User user) {
ensureDBHelperExist(context);
dbHelper.insert(user);
}
/**
* @param context 务必使用ApplicationContext,直接使用activity/service的context可能导致内存泄露
* @return
*/
public synchronized static int getUserNums(Context context) {
ensureDBHelperExist(context);
return dbHelper.getUserNums();
}
public synchronized static void close() {
if (dbHelper != null) {
dbHelper.close();
dbHelper = null;
}
}
}
分享到:
相关推荐
标题中的"an_mysql.rar_ android Mysql_Android 数据库_Android数据库_MYSQL_android"表明这是一个关于Android应用程序与MySQL数据库交互的资源包。描述指出在Android设备上实现与MySQL数据库的连接时,需要确保设备...
本Demo——"你想要的Android数据库操作精华(安全、并发、单例等)",旨在深入探讨如何在Android Studio环境下进行高效且安全的数据库操作,包括使用数据库框架、数据库加密、并发控制以及单例模式的应用。...
本项目"android_blog.zip"显然是一个关于Android数据库实现的示例,其中包含了服务器端和客户端的完整代码,且使用了MySQL作为后端数据库。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它在服务器端...
在Android开发中,数据同步是一项重要的任务,尤其是在网络应用中,保持手机客户端的数据与服务器数据库同步至关重要。"android-follow-server.zip"这个压缩包文件显然包含了关于实现这一目标的相关资源。让我们详细...
要实现Android和PC之间的SQLite数据库同步,我们需要解决以下几个关键问题: 1. **数据传输**:首先,需要一个可靠的通信机制来传递数据,这通常可以通过HTTP、WebSocket或FTP等网络协议实现。在Delphi XE7中,我们...
**Android数据库调试** 在Android开发中,SQLite数据库是最常见的本地数据存储方式。通常,开发者需要通过adb命令行工具或者使用像Android Studio这样的IDE内置功能来查看和操作SQLite数据库。然而,`Android-Debug...
这个"Android数据库Demo-GreenDaoTest.zip"是一个演示如何使用GreenDao的实例,通过分析这个Demo,我们可以深入理解GreenDao的用法和优势。 首先,GreenDao的核心思想是将Java对象映射到SQLite数据库中的表格,这样...
10. **同步与版本控制**:与版本控制系统集成,跟踪数据库结构的变更,便于团队协作。 在Android开发中,熟悉并掌握SQLite数据库管理工具是非常重要的技能。通过SQLiteExpert,开发者可以更加专注于业务逻辑的实现...
在Android应用开发中,数据库操作是一项重要的任务,用于存储和检索数据。GreenDao是一个流行的ORM(对象关系映射)框架,它使得Java对象与SQLite数据库之间的交互变得简单易行。本资源提供了一份关于如何封装和使用...
综上所述,实现“Android 数据库自定义日历签到”涉及多个方面,包括数据库设计、自定义视图绘制、事件监听、数据同步、UI更新以及性能优化等。通过熟练掌握这些知识点,开发者可以构建出高效、易用的日历签到应用。
通过以上步骤,你可以实现一个简单的Android数据库注册和登录功能。不过,这只是基础,实际应用中还可能涉及到数据持久化、网络同步、多线程等更复杂的问题。随着技术的深入,你可以进一步学习和掌握这些高级概念。
4. Realm: Realm是一个跨平台的数据库,提供了比SQLite更现代的API,支持实时数据同步。在Android上, Realm 提供了易于使用的对象模型,无需SQL知识即可进行数据操作。此外,Realm还具有内存优化和强大的数据持久...
**Android数据库SQLite的基本用法** SQLite是Android系统中默认的轻量级数据库,它支持标准的关系型数据库操作,如创建、查询、更新和删除数据。SQLite数据库文件存储在应用程序的私有目录下,保证了数据的安全性。...
3. **实时数据**:ObjectBox支持实时数据同步,一旦数据发生变化,应用程序可以立即获取到更新,无需手动刷新。 4. **多线程支持**:ObjectBox允许在多个线程中并发地读写数据,提高了应用的并发性能。 5. **内存...
在这个"Android数据库SQLite基本操作工程"中,我们将深入探讨如何在Android应用中进行最基础的数据库操作:增、删、改、查。 1. **创建SQLite数据库** - 在Android中,我们通常通过继承`SQLiteOpenHelper`类来创建...
在Android操作系统中,短信数据的存储通常依赖于SQLite数据库,这是一种轻量级、关系型的数据库管理系统,适用于移动设备上本地数据存储。标题中的“sms.zip_Android 数据库_android_android sms_sms”暗示了这是一...
在Android开发中,连接电脑数据库是一项常见的任务,尤其是在进行数据同步或者测试时。这个压缩包文件包含了一系列...通过学习这些例子,开发者可以掌握到Android数据库连接的多种技术和实践策略,提升自己的开发能力。
在Android应用开发中,数据库是存储用户数据的重要方式,SQLite作为Android系统内置的轻量级数据库,被广泛使用。...通过上述的步骤和最佳实践,可以有效地在应用中集成并使用SQLCipher,为Android数据库安全提供保障。
在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的数据库系统,适用于移动设备。SQLite被集成在Android操作系统中,为应用程序提供本地数据存储功能。本资料包"Android 数据库SQLite.rar"包含了...