Android数据库(二) Android数据库框架和使用_public mydbhelper(context context)-程序员宅基地

android和ios的数据库都是用SQLite来实现。

在安卓里面数据库怎么用呢,简单来说可用分为以下三步:

1、新建一个数据库帮助类,继承自SQLiteOpenHelper,复写onCreate()  和 onUpgrade()

2、新建一个数据里操作类(dao类),利用 数据库帮助类 得到数据库的实例,然后在dao类里面编写 增删改查 的方法

3、在Activity里面实例化数据库操作类(dao类),调用对应的 增删查改方法。

Android数据的具体使用(原生数据库操作类)

1、编写数据库帮助类

· 新建一个数据库帮助类,继承自SQLiteOpenHelper

· 编写构造函数

· 复写onCreate() onUpgrade()

代码如下:

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

public class MyDBHelper extends SQLiteOpenHelper{

    public MyDBHelper(Context context) {
        /**
         * 参数说明:
         *
         * 第一个参数: 上下文
         * 第二个参数:数据库的名称
         * 第三个参数:null代表的是默认的游标工厂
         * 第四个参数:是数据库的版本号  数据库只能升级,不能降级,版本号只能变大不能变小
         */
        super(context, "mintest.db", null, 2);
    }


    /**
     * onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
     *
     * 当数据库第一次被创建的时候调用的方法,适合在这个方法里面把数据库的表结构定义出来.
     * 所以只有程序第一次运行的时候才会执行
     * 如果想再看到这个函数执行,必须写在程序然后重新安装这个app
     */

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table contactinfo (id integer primary key autoincrement, name varchar(20), phone varchar(20))");
    }


    /**
     * 当数据库更新的时候调用的方法
     * 这个要显示出来得在上面的super语句里面版本号发生改变时才会 打印  (super(context, "itheima.db", null, 2); )
     * 注意,数据库的版本号只可以变大,不能变小,假设我们当前写的版本号是3,运行,然后又改成1,运行则报错。不能变小
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table contactinfo add account varchar(20)");
    }
}

2、数据库操作类(dao类)

dao类在这里做得事情特别简单:

· 1、定义一个构造方法,利用这个方法去实例化一个 数据库帮助类

· 2、编写dao类的对应的 增删改查 方法。

代码如下:

package amqr.com.dbanddao.dao;

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

import amqr.com.dbanddao.db.MyDBHelper;

/**
 *  ContactInjfoDao  数据库操作类  dao后缀的都是数据库操作类
 *
 *  我们这里的每一个 增删改查 的方法都通过getWritableDatabase()去实例化了一个数据库,这里必须这么做
 *  不客气抽取 成为一个成员变量, 否则报错,若是觉得麻烦可以通过定义方法来置为null和重新赋值
 *
 *  —— 其实dao类在这里做得事情特别简单:
 *  1、定义一个构造方法,利用这个方法去实例化一个  数据库帮助类
 *  2、编写dao类的对应的 增删改查 方法。
 *
 */
public class ContactInjfoDao {

    private MyDBHelper mMyDBHelper;

    /**
     * dao类需要实例化数据库Help类,只有得到帮助类的对象我们才可以实例化 SQLiteDatabase
     * @param context
     */
    public ContactInjfoDao(Context context) {
        mMyDBHelper=new MyDBHelper(context);
    }

    // 将数据库打开帮帮助类实例化,然后利用这个对象
    // 调用谷歌的api去进行增删改查

    // 增加的方法吗,返回的的是一个long值
    public long addDate(String name,String phone){
        // 增删改查每一个方法都要得到数据库,然后操作完成后一定要关闭
        // getWritableDatabase(); 执行后数据库文件才会生成
        // 数据库文件利用DDMS可以查看,在 data/data/包名/databases 目录下即可查看
        SQLiteDatabase sqLiteDatabase =  mMyDBHelper.getWritableDatabase();
        ContentValues contentValues=new ContentValues();

        contentValues.put("name",name);
        contentValues.put("phone", phone);
        // 返回,显示数据添加在第几行
        // 加了现在连续添加了3行数据,突然删掉第三行,然后再添加一条数据返回的是4不是3
        // 因为自增长
        long rowid=sqLiteDatabase.insert("contactinfo",null,contentValues);

        sqLiteDatabase.close();
        return rowid;
    }


    // 删除的方法,返回值是int
    public int deleteDate(String name){
        SQLiteDatabase sqLiteDatabase = mMyDBHelper.getWritableDatabase();
        int deleteResult = sqLiteDatabase.delete("contactinfo", "name=?", new String[]{name});
        sqLiteDatabase.close();
        return deleteResult;
    }

    /**
     * 修改的方法
     * @param name
     * @param newPhone
     * @return
     */
    public int updateData(String name,String newPhone){
        SQLiteDatabase sqLiteDatabase = mMyDBHelper.getWritableDatabase();
        ContentValues contentValues =new ContentValues();
        contentValues.put("phone", newPhone);
        int updateResult = sqLiteDatabase.update("contactinfo", contentValues, "name=?", new String[]{name});
        sqLiteDatabase.close();
        return updateResult;
    }

    /**
     * 查询的方法(查找电话)
     * @param name
     * @return
     */
    public String alterDate(String name){
        String phone = null;

        SQLiteDatabase readableDatabase = mMyDBHelper.getReadableDatabase();
        // 查询比较特别,涉及到 cursor
        Cursor cursor = readableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
        if(cursor.moveToNext()){
            phone=cursor.getString(0);
        }
        cursor.close(); // 记得关闭 corsor
        readableDatabase.close(); // 关闭数据库
        return phone;
    }


}
  
  
   
package amqr.com.dbanddao; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import amqr.com.dbanddao.dao.ContactInjfoDao; public class MainActivity extends AppCompatActivity { private EditText mEtName; private EditText mEtPhone; private ContactInjfoDao mDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDao=new ContactInjfoDao(MainActivity.this); mEtName= (EditText) findViewById(R.id.mEtName); mEtPhone= (EditText) findViewById(R.id.mEtPhone); } public void add(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ long addLong = mDao.addDate(name, phone); if(addLong==-1){ Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show(); } } } public void delete(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int deleteDate = mDao.deleteDate(name); if(deleteDate==-1){ Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show(); } } } public void update(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int count=mDao.updateData(name, phone); if(count==-1){ Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show(); } } } public void query(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ String phoneResult = mDao.alterDate(name); Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show(); } } }
作者:阿敏其人 链接:https://www.jianshu.com/p/b5ff80941fab 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3.Activity中

  
  
   
package amqr.com.dbanddao; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import amqr.com.dbanddao.dao.ContactInjfoDao; public class MainActivity extends AppCompatActivity { private EditText mEtName; private EditText mEtPhone; private ContactInjfoDao mDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDao=new ContactInjfoDao(MainActivity.this); mEtName= (EditText) findViewById(R.id.mEtName); mEtPhone= (EditText) findViewById(R.id.mEtPhone); } public void add(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ long addLong = mDao.addDate(name, phone); if(addLong==-1){ Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show(); } } } public void delete(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int deleteDate = mDao.deleteDate(name); if(deleteDate==-1){ Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show(); } } } public void update(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int count=mDao.updateData(name, phone); if(count==-1){ Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show(); } } } public void query(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ String phoneResult = mDao.alterDate(name); Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show(); } } }
作者:阿敏其人 链接:https://www.jianshu.com/p/b5ff80941fab 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  
  
   
package amqr.com.dbanddao; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import amqr.com.dbanddao.dao.ContactInjfoDao; public class MainActivity extends AppCompatActivity { private EditText mEtName; private EditText mEtPhone; private ContactInjfoDao mDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDao=new ContactInjfoDao(MainActivity.this); mEtName= (EditText) findViewById(R.id.mEtName); mEtPhone= (EditText) findViewById(R.id.mEtPhone); } public void add(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ long addLong = mDao.addDate(name, phone); if(addLong==-1){ Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show(); } } } public void delete(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int deleteDate = mDao.deleteDate(name); if(deleteDate==-1){ Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show(); } } } public void update(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int count=mDao.updateData(name, phone); if(count==-1){ Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show(); } } } public void query(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ String phoneResult = mDao.alterDate(name); Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show(); } } }
作者:阿敏其人 链接:https://www.jianshu.com/p/b5ff80941fab 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

package amqr.com.dbanddao;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import amqr.com.dbanddao.dao.ContactInjfoDao;

public class MainActivity extends AppCompatActivity {
   private EditText mEtName;
   private EditText mEtPhone;
   private ContactInjfoDao mDao;

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

       mDao=new ContactInjfoDao(MainActivity.this);
       mEtName= (EditText) findViewById(R.id.mEtName);
       mEtPhone= (EditText) findViewById(R.id.mEtPhone);

   }

   public void add(View view){

       String name=mEtName.getText().toString().trim();
       String phone=mEtPhone.getText().toString().trim();
       if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
           Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
           return;
       }else{
           long addLong = mDao.addDate(name, phone);
           if(addLong==-1){
               Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show();
           }else{
               Toast.makeText(this,"数据添加在第  "+addLong+"   行",Toast.LENGTH_SHORT).show();
           }

       }
   }

   public void delete(View view){
       String name=mEtName.getText().toString().trim();


       if(TextUtils.isEmpty(name)){
           Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
           return;
       }else{
           int deleteDate = mDao.deleteDate(name);
           if(deleteDate==-1){
               Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show();
           }else{
               Toast.makeText(this,"成功删除  "+deleteDate+"   条数据",Toast.LENGTH_SHORT).show();
           }

       }

   }


   public void update(View view){

       String name=mEtName.getText().toString().trim();
       String phone=mEtPhone.getText().toString().trim();
       if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
           Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
           return;
       }else{
           int count=mDao.updateData(name, phone);
           if(count==-1){
               Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show();
           }else{
               Toast.makeText(this,"数据更新了  "+count+"   行",Toast.LENGTH_SHORT).show();
           }

       }
   }


   public void query(View view){

       String name=mEtName.getText().toString().trim();
       
       if(TextUtils.isEmpty(name)){
           Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
           return;
       }else{
           String phoneResult = mDao.alterDate(name);

           Toast.makeText(this,"手机号码为:    "+phoneResult,Toast.LENGTH_SHORT).show();


       }
   }

}

google中数据库增删改查的方法

1、增,insert()

  /**
     * 添加一条记录
     * @param name 联系人姓名
     * @param phone 联系人电话
     * @return 返回的是添加后在数据库的行号  -1代表添加失败
     */
    public long add(String name, String phone){
        SQLiteDatabase db = helper.getWritableDatabase();
        //db.execSQL("insert into contactinfo (name,phone) values (?,?)", new Object[]{name,phone});
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("phone", phone);
        //内部是组拼sql语句实现的.
        long rowid = db.insert("contactinfo", null, values);
        //记得释放数据库资源
        db.close();
        return rowid;
    }

2、删 delete();

/**
     * 根据姓名删除一条记录
     * @param name 要删除的联系人的姓名
     * @return 返回0代表的是没有删除任何的记录 返回整数int值代表删除了几条数据
     */
    public int delete(String name){
        //判断这个数据是否存在.
        SQLiteDatabase db = helper.getWritableDatabase();
        //db.execSQL("delete from contactinfo where name=?", new Object[]{name});
        int rowcount = db.delete("contactinfo", "name=?", new String[]{name});
        db.close();
        //再从数据库里面查询一遍,看name是否还在
        return rowcount;
    }

3、改,update()

/**
     * 修改联系人电话号码
     * @param newphone 新的电话号码
     * @param name 要修改的联系人姓名
     * @return 0代表一行也没有更新成功, >0 整数代表的是更新了多少行记录
     */
    public int update(String newphone , String name){
        SQLiteDatabase db = helper.getWritableDatabase();
        //db.execSQL("update contactinfo set phone =? where name=?", new Object[]{newphone,name});
        ContentValues values = new ContentValues();
        values.put("phone", newphone);
        int rowcount =  db.update("contactinfo", values, "name=?", new String[]{name});
        db.close();
        return rowcount;
    }

4、查, query()

/**
     * 查询联系人的电话号码
     * @param name 要查询的联系人
     * @return 电话号码
     */
    public String getPhoneNumber(String name){
        String phone = null;
        SQLiteDatabase db = helper.getReadableDatabase();
        //Cursor  cursor = db.rawQuery("select phone from contactinfo where name=?", new String[]{name});
        Cursor  cursor =  db.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
        if(cursor.moveToNext()){//如果光标可以移动到下一位,代表就是查询到了数据
            phone = cursor.getString(0);
        }
        cursor.close();//关闭掉游标,释放资源
        db.close();//关闭数据库,释放资源
        return phone;
    }


Android 数据库框架

ORMLit的使用

1、下载 ORMLite Jar

首先去ORMLite官网下载jar包


2、配置bean类

通过注解的方式把bean类和数据库联系在一起

@DatabaseTable(tableName = "person")
public class Person {
 
    @DatabaseField(generatedId=true)
    private int id;
    @DatabaseField(columnName="name")
    private String name;
    @DatabaseField(columnName="age")
    private int age;
    @DatabaseField(columnName="address")
    private String address;
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the age
     */
    public int getAge() {
        return age;
    }
    /**
     * @param age the age to set
     */
    public void setAge(int age) {
        this.age = age;
    }
    /**
     * @return the address
     */
    public String getAddress() {
        return address;
    }
    /**
     * @param address the address to set
     */
    public void setAddress(String address) {
        this.address = address;
    }
 
}
在这里我们创建了Bean类,并与数据库建立了联系,有两件事是我们需要做的
1.需要在@DatabaseTable注解中填入表名
2.在@DatabaseField(columnName=”“)填入字段名,设置字段的属性等等

创建数据库

与Android中的数据库创建相似,使用OrmLite创建数据库需要我们创建一个SqlOpenHelper继承OrmLiteSqliteOpenHelper,在OrmLiteSqliteOpenHelper也有两个重要方法,分别是onCreate和onUpgrade,负责数据库创建以及升级时的操作

public class MySqlOpenHelper extends OrmLiteSqliteOpenHelper {
 
    private Dao<Person, Integer> mPersonDao;
 
    public MySqlOpenHelper(Context context) {
        super(context, "test", null, 1);
        // TODO Auto-generated constructor stub
    }
 
    @Override
    public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
        // TODO Auto-generated method stub
        try {
            //创建数据表
            TableUtils.createTableIfNotExists(arg1, Person.class);
        } catch (java.sql.SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,
            int arg3) {
        // TODO Auto-generated method stub
 
    }
 
    public Dao<Person, Integer> getPersonDao() throws java.sql.SQLException {
        if (mPersonDao == null) {
            mPersonDao = getDao(Person.class);
        }
        return mPersonDao;
    }
 
}

数据库操作

插入操作

这些方法使用起来都比较简单,我们只需将自己的Bean传入到下列方法中即可

  • create:插入一条数据
  • createIfNotExists:如果不存在则插入
  • createOrUpdate:如果存在则更新

查询操作

OrmLite为我提供了一系列的查询操作,方法很多,而且很多都是只看方法名就可以知道的,这里就不逐一介绍了,在这里介绍一下如何使用QueryBuilder进行复杂查找。

  • 首先调用personDao.queryBuilder();获得该Dao下的QueryBuilder对象,
  • 接下来设置QueryBuilder的查询条件,
  • 最后通过QueryBuilder的query方法获得List对象,
下面介绍几个常用的builder下的查询,
1.多字段条件查询:

QueryBuilder builder = dao.queryBuilder();
builder.where().eq("字段名1","条件1").and.eq(""字段名2","条件2");
builder.query();
2.查询并按顺序输出
QueryBuilder<Person, Integer> builder = dao.queryBuilder();
builder.orderBy("字段名", true);
builder.query();

orderBy的方法第一参数表示按那个字段进行排序,第二个参数表示是否为升序。

3.分页查询

QueryBuilder<Person, Integer> builder = dao.queryBuilder();
builder.offset(10);//表示查询的起始位置
builder.limit(10);//表示总共获取的对象数量
builder.query();

删除和更改操作

与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似,就不详细介绍了。


其他框架总结与应用 点击打开链接








版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36018900/article/details/78911399

智能推荐

linux下dhcp与dhcp中继-程序员宅基地

文章浏览阅读95次。Dhcp就是动态主机配置协议,采用UDP协议,客户端用68号端口,服务器端用67号端口。Dhcp原理:Dhcp中继的原理:把广播转换成单播案例:拓扑图:目标:在不同网段获得ip地址。实验步骤:1、搭建dhcp服务器[root@zlj~]#mkdir/mnt/cdrom[root@zlj~]#..._linux debian dchp中继

C语言 | 三个整数的排序_三个整数排序c语言-程序员宅基地

文章浏览阅读1.6w次,点赞16次,收藏71次。题目:输入三个正整数x,y,z,请把这三个数由小到大输出。【方法一】这是C语言教程里常出现的一道题。处理方法是:假设最小的数为x上,先将x与y进行比较,如果x>y则将x与y的值进行..._三个整数排序c语言

基于spring validation多层对象校验_spring validation 多层-程序员宅基地

文章浏览阅读6.9k次。1、第一层对象定义package com.ybw.validation.demo.vo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.validation.Valid;import java.io.Serializable;/** * 请求参数 * * @author geoffrey * @version V1.0 * @cl_spring validation 多层

落谷 P1140 相似基因_家都知道,基因可以看作一个碱基对序列。它包含了 444 种核苷酸,简记作 a,c,g,ta,c-程序员宅基地

文章浏览阅读916次。题目背景大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。题目描述两个基因的相似度的计算方法如下:对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空_家都知道,基因可以看作一个碱基对序列。它包含了 444 种核苷酸,简记作 a,c,g,ta,c

MFC读取Excel文件+数据处理+写入Excel_export2excel.h-程序员宅基地

文章浏览阅读2.5w次,点赞21次,收藏232次。在日常编程的过程中,我们经常会遇到需要读写文件的操作,当然,最好的选择是数据库来进行读写,但是由于数据库使用环境的要求(比如某些数据库要求必须安装数据库软件后才能使用),同时,要进行数据库操作需要对SQL语句有一定的了解,门槛相对较高,所以我们有时需要用EXCEL来代替简单的数据库操作,对于MFC连接数据库并进行对应操作,可以参考之前的博客:MFC以ADO方式连接ACCESS数据库今天主要介绍..._export2excel.h

南方CASS软件VB二次开发之一安装软件以及调出VB编辑器_cass加载vba-程序员宅基地

文章浏览阅读341次。南方CASS软件VB二次开发之一安装软件_cass加载vba

随便推点

Elasticsearch+Logstash+Kibana教程-程序员宅基地

文章浏览阅读235次。参考资料累了就听会歌吧!Elasticsearch中文参考文档Elasticsearch官方文档Elasticsearch其他——那些年遇到的坑Elasticsearch 管理文档Elasticsearch集群配置以及REST API使用Elasticsearch集群管理Elasticsearch 数据搜索篇·【入门级干货】Elasticsea..._kibana 动态地图

ABAQUS 钢筋混凝土结构建模_abaqus中混凝土本构模型-程序员宅基地

文章浏览阅读1k次。复合材料是一种具有优异性能的材料,广泛应用于航空、汽车、建筑、船舶、体育器材等领域。ABAQUS 作为现阶段应用最广泛的有限元仿真模拟软件,优秀的分析能力和模拟复杂系统的可靠性使得 ABAQUS 被各国的工业和科学研究中广泛采用。通过合理的建模和分析,可以更好地理解复合材料的力学行为,为复合材料的设计和应用提供参考。(2D 网格划分、3D 网格划分、过渡网格划分、网格质量检查)四、钢筋混凝土结构静力与动力分析模拟实例(一)10、钢筋混凝土柱的轴压与偏压模拟(实例)4、 ABAQUS 中的混凝土材料模型。_abaqus中混凝土本构模型

FL Studio 21.2.3.4004中文版安装图文教程及fl Studio适用哪些人群_fl studio21.2.3.4004-程序员宅基地

文章浏览阅读748次,点赞37次,收藏14次。音乐制作人:无论是专业的音乐制作人还是初学者,FL Studio 2024都为他们提供了一个完整的音乐制作环境。音乐爱好者和独立音乐人:即使是没有专业音乐背景的音乐爱好者和独立音乐人,也可以通过FL Studio 21.2.3.4004轻松入门音乐制作。声音设计师和音效师:对于需要创作和处理各种声音效果的声音设计师和音效师来说,FL Studio 21.2.3.4004提供了强大的音频编辑和处理工具,可以帮助他们创作出独特而富有创意的声音效果。_fl studio21.2.3.4004

Hbase shell_hbase shell下载表-程序员宅基地

文章浏览阅读529次。一. 介绍 HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。 HBase以表_hbase shell下载表

华为工业云平台:制造业企业数据平台建设最佳实践分享_华为云数字工厂企业平台-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏10次。本文素材来自于华为工业云平台组织的工业数字化大讲堂,本期主题为:制造业企业数据平台建设最佳实践分享。我们将从制造业的发展趋势出发,分享华为云在制造领域里建设数据平台的最佳实践,帮助企业解决在数字化转型中面临的挑战,并结合华为云数据平台架构设计和数据应用等方面的丰富经验,助力企业挖掘数据价值、驱动数字化转型、创造发展新机会。_华为云数字工厂企业平台

python格式化符号、转义字符、结束符号_python格式符号什么意思-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏4次。一、格式化符号含义格式符号 转换 %s 字符串 %d 有符号的十进制数 %f 浮点数 %c 字符 %u 无符号的十进制数 %o 八进制整数 %x 十六进制整数(小写ox) %X 十六进制整数(大写OX) %e 科学计数法(小写‘e’) %E 科学计数法(大写‘E’) %g %f和%e的简写 %G %f和%E的简写 ..._python格式符号什么意思

推荐文章

热门文章

相关标签